Spring Boot3.0升级,踩坑之旅,附解决方案(二)

简介: Spring Boot3.0升级,踩坑之旅,附解决方案(二)

image.png

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

书接上文再 Spring Boot3.0升级,踩坑之旅,附解决方案 第一篇中我们介绍了大部分 Spring Boot3.0  升级所带来的破坏性修改,这篇文章将介绍剩下的修改部分,并针对Jdk17升级带来的优化写法进行案例展示。

本文基于 newbeemall 项目升级Spring Boot3.0踩坑总结而来

一。Jdk8中内置的JavaScript引擎 nashorn 被移除,导致验证码使用报错Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null

项目中使用了 com.github.whvcse包的easy-captcha 验证码依赖,升级至Jdk17后,验证码接口报错:Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null,错误原因很明显脚本引擎执行脚本语句报错,因为执行引擎为空。查询相关资料Jdk8自带的JavaScript引擎 nashorn 再升级到Jdk9后就被移除了,从而导致报错

解决办法:添加JavaScript引擎 nashorn依赖

一。Jdk8中内置的JavaScript引擎 nashorn 被移除,导致验证码使用报错Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null
项目中使用了 com.github.whvcse包的easy-captcha 验证码依赖,升级至Jdk17后,验证码接口报错:Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null,错误原因很明显脚本引擎执行脚本语句报错,因为执行引擎为空。查询相关资料Jdk8自带的JavaScript引擎 nashorn 再升级到Jdk9后就被移除了,从而导致报错
解决办法:添加JavaScript引擎 nashorn依赖
作者:waynaqua
链接:https://juejin.cn/post/7181019431558971451
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二. Spring data redis 配置前缀被修改

Spring Boot2.0 中 redis的配置前缀为 spring.redis

image.png

但是在最新 Spring Boot3.0 中redis的配置前缀被修改为 spring.data.redis,导致老项目中redis配置写法需要修改,如下图

image.png这里我们猜测一波,Spring 对redis配置的破坏性修改可能是为了统一 Spring data 配置把。

解决办法,修改redis配置前缀为 spring.data.redis

三. 升级Jdk17的优化一些写法

3.1 文本块语法。再很多其他语言中早就支持的文本块写法,现在在Jdk17中也可以通过 """ 语法使用啦,如下,针对一段 lua 脚本代码,我们再也不用通过字符串拼接了

private String buildLuaScript() {
    return "local c" +
            "\nc = redis.call('get',KEYS[1])" +
            "\nif c and tonumber(c) > tonumber(ARGV[1]) then" +
            "\nreturn c;" +
            "\nend" +
            "\nc = redis.call('incr',KEYS[1])" +
            "\nif tonumber(c) == 1 then" +
            "\nredis.call('expire',KEYS[1],ARGV[2])" +
            "\nend" +
            "\nreturn c;";
}

文本块写法,代码可读性提高了一个档次

private String buildLuaScript() {
    return """
            local c
            c = redis.call('get',KEYS[1])
            if c and tonumber(c) > tonumber(ARGV[1]) then
            return c;
            end
            c = redis.call('incr',KEYS[1])
            if tonumber(c) == 1 then
            redis.call('expire',KEYS[1],ARGV[2])
            end
            return c;""";
}

3.2 instanceof 模式匹配

Jdk17中针对 instanceof 关键字支持模式变量定义,可以减少不必要的强制转换逻辑,如下

java

复制代码

if (handler instanceof HandlerMethod) {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    Method method = handlerMethod.getMethod();
    RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
    if (annotation != null) {
        if (this.isRepeatSubmit(request)) {
            R error = R.error("不允许重复提交,请稍后再试");
            ServletUtil.renderString(response, JSON.toJSONString(error));
            return false;
        }
    }
}

使用模式变量,可以消除代码中不必要的类型转换

if (handler instanceof HandlerMethod handlerMethod) {
    Method method = handlerMethod.getMethod();
    RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
    if (annotation != null) {
        if (this.isRepeatSubmit(request)) {
            R error = R.error("不允许重复提交,请稍后再试");
            ServletUtil.renderString(response, JSON.toJSONString(error));
            return false;
        }
    }
}

3.3 switch 表达式扩展

升级到Jdk17后支持 switch 表达式扩展写法,优化前的写法

public static String getExtension(String prefix) {
    switch (prefix) {
        case IMAGE_PNG:
            return "png";
        case IMAGE_JPG:
            return "jpg";
        case IMAGE_JPEG:
            return "jpeg";
        case IMAGE_BMP:
            return "bmp";
        case IMAGE_GIF:
            return "gif";
        default:
            return "";
    }
}

使用 switch 表达式扩展

public static String getExtension(String prefix) {
    return switch (prefix) {
        case IMAGE_PNG -> "png";
        case IMAGE_JPG -> "jpg";
        case IMAGE_JPEG -> "jpeg";
        case IMAGE_BMP -> "bmp";
        case IMAGE_GIF -> "gif";
        default -> "";
    };
}

总结

本文介绍了Spring Boot 3.0 升级带来了破坏性更改第二部分介绍,也展示了一些新版Jdk的优化写法,希望更多的朋友能够尝试升级到最新 Spring Boot 3.0,紧跟时代潮流

Spring Boot3.0升级,踩坑之旅,附解决方案

目录
相关文章
|
5月前
|
消息中间件 NoSQL Java
spring boot2升级boot3指南
本文介绍了如何将Spring Boot 2.x升级至Spring Boot 3.x,涵盖使用OpenRewrite自动化重构工具进行代码转换、依赖版本升级、配置属性调整及常见问题处理等内容,帮助开发者高效完成升级工作。
2140 6
|
人工智能 监控 安全
智慧工地解决方案,Spring Cloud智慧工地源代码
智慧工地平台针对建筑工地人员管理难、机械设备繁多、用电安全及施工环境复杂等问题,通过集成应用和硬件设备,实现数据互联互通与集中展示。基于微服务架构(Java+Spring Cloud+UniApp+MySql),平台支持PC端、手机端、平板端、大屏端管理,涵盖人员实名制、工资考勤、视频AI监控、绿色施工、危大工程监测、物料管理和安全质量管理等功能,助力施工现场的数字化、智能化综合管理,提升效率与安全性。
314 15
|
9月前
|
druid Java 关系型数据库
Spring Boot与Druid升级解决方案
好的,我需要帮助用户解决他们遇到的数据库连接问题,并升级项目的依赖。首先,用户提供的错误信息是关于Spring Boot应用在初始化数据源时抛出的异常,具体是Druid连接池验证连接失败。同时,用户希望升级项目的依赖版本。
865 10
|
10月前
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
456 5
|
10月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
435 0
|
10月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
670 0
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
841 7
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。