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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 项目中使用了 com.github.whvcse包的easy-captcha 验证码依赖,升级至Jdk17后,验证码接口报错:Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null,错误原因很明显脚本引擎执行脚本语句报错,因为执行引擎为空。查询相关资料Jdk8自带的JavaScript引擎 nashorn 再升级到Jdk9后就被移除了,从而导致报错

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

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


复制代码
二. Spring data redis 配置前缀被修改
在 Spring Boot2.0 中 redis的配置前缀为 spring.redis
0.01.png

但是在最新 Spring Boot3.0 中redis的配置前缀被修改为 spring.data.redis,导致老项目中redis配置写法需要修改,如下图
0.02.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 关键字支持模式变量定义,可以减少不必要的强制转换逻辑,如下
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,紧跟时代潮流

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL Java Redis
Springboot从2.x升级到3.x以后redis默认配置调整
Springboot从2.x升级到3.x以后redis默认配置调整
51 0
|
4月前
|
缓存 负载均衡 Java
Spring Cloud Alibaba client升级问题之升级报错如何解决
Spring Cloud Alibaba提供了一套在Spring Cloud框架基础上构建的微服务解决方案,旨在简化分布式系统的开发和管理;本合集将探讨Spring Cloud Alibaba在实际应用中的部署和使用技巧,以及该框架常见问题的诊断方法和解决步骤。
|
5月前
|
缓存 前端开发 Java
13:SpringBoot跨域解决方案-Java Spring
13:SpringBoot跨域解决方案-Java Spring
85 0
|
5月前
|
前端开发 Java 数据库连接
Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
|
3月前
|
消息中间件 NoSQL Java
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
277 1
|
14天前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
20天前
|
缓存 Java 数据库
第8章 Spring Security 的常见问题与解决方案(2024 最新版)(下)
第8章 Spring Security 的常见问题与解决方案(2024 最新版)
30 0
|
20天前
|
安全 Java 数据安全/隐私保护
第8章 Spring Security 的常见问题与解决方案(2024 最新版)(上)
第8章 Spring Security 的常见问题与解决方案(2024 最新版)
34 0
|
1月前
|
安全 Java
Springboot2.1.1版本升级到2.3.10版本报错合集及解决办法
Springboot2.1.1版本升级到2.3.10版本报错合集及解决办法
|
4月前
|
Java Maven 数据安全/隐私保护
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!