一。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依赖
<dependency>

<groupId>org.openjdk.nashorn</groupId><artifactId>nashorn-core</artifactId><version>15.4</version>

</dependency>
复制代码
二. Spring data redis 配置前缀被批改
在 Spring Boot2.0 中 redis的配置前缀为 spring.redis

然而在最新 Spring Boot3.0 中redis的配置前缀被批改为 spring.data.redis,导致老我的项目中redis配置写法须要批改,如下图

这里咱们猜想一波,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 关键字反对模式变量定义,能够缩小不必要的强制转换逻辑,如下
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,紧跟时代潮流