最近将自己的个人项目(etf.misea.top)的服务端代码做了部分重构,全面使用JDK17,顺便升级了部分依赖,搞着搞着索性将SpringBoot框架从SpringBoot2.7x升级到了SpringBoot3.x。
在此过程中遇到了一些问题,做个简要的记录。
javax修改为jakarta
本来以为改个版本号,刷新下依赖,就可以无感升级了,但是搞着搞着发现服务跑不起来了,淦。
首当其冲的就是项目中有关javax的import基本上都爆红了,替换为jakarta即可,Java EE到Jakarta EE这事儿喊了那么多年,也终于落地了。
Jakarta EE 9 版本标志着从 javax.* 命名空间到 Eclipse 的 jakarta.* 的最终过渡,此版本将所有 API 更新为在包名称中使用 jakarta.*
顺便还八卦了下 Eclipse 基金会和 Oracle 之间谈判,总的来说最后就是Jakarta EE 不能发布针对基础库 javax 的修改包,Jakarta EE 规范也不能使用包括 Java 商标的现有规范名称。
这个的影响还蛮大的,比如之前一系列的包,像javax.servlet,javax.mail,javax.validation 都得替换成jakarta的包。
除了框架之外,这个还影响到了很多依赖库,比如Hutool,也要做适当的替换,比如ServletUtil要换成JakartaServletUtil诸如此类的。
fastjson2的一些问题
如果你用的是fastjson2的2.0.22 之后的更高版本,那么你可能会发现FastJsonHttpMessageConverter和GenericFastJsonRedisSerializer没有了,这里需要单独导入扩展包来解决这个问题,@wenshao说Spring5和Spring6没办法兼容,SpringBoot3.x只需要导fastjson2-extension-spring5即可。
Spring5
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension-spring5</artifactId>
<version>2.0.31</version>
</dependency>
Spring6
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension-spring6</artifactId>
<version>2.0.31</version>
</dependency>
使用hikari替换druid
emmmm,由于SpringBoot3.x使用了 Jakarta EE 10 ,druid 也受到了上述问题的一些影响,导致没办法正常工作,查了下相关的Issues,@wenshao说他忙着搞fastjson2,估计要等23年元旦之后看,这个问题确实比较麻烦,没办法2和3进行兼容。(这都23年五一过完了,还没解决,可能要单独针对3.0出一个版本了)
解决办法也有,就是自己在手动打个私有包使用Jakarta,然后修改下自动装配的SPI结构也能勉强用,不过太麻烦了,还是直接换成SpringBoot内置的HikariCP连接池吧,之前只是听说过,但是没用过。
更新 mysql 依赖
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
从mysql-connector-java更新到mysql-connector-j, 如果你用的还是上古时期的MySQL可以不用管。
mysql-connector-j和mysql-connector-java的差异可以看看这篇文章。 是时候升级 MySQL Connector/J 到 8.0 了
升级下dynamic-datasource-spring-boot-starter
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.6.1</version>
</dependency>
我是用dynamic-datasource 做的多数据源切换,所以随手升级了下。
修改SrpingBoot启动配置文件
datasource:
dynamic:
#设置默认的数据源或者数据源组,默认值即为master
primary: master
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master:
url: dburl
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
# 将连接池类型替换为HikariDataSource
# type: com.alibaba.druid.pool.DruidDataSource
type: com.zaxxer.hikari.HikariDataSource
hikari:
pool-name: HikariCP
minimum-idle: 5
# 空闲连接存活最大时间,默认600000(10分钟)
idle-timeout: 180000
# 连接池最大连接数,默认是10
maximum-pool-size: 10
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
max-lifetime: 1800000
# 数据库连接超时时间,默认30秒,即30000
connection-timeout: 30000
connection-test-query: SELECT 1
# 此属性控制从池返回的连接的默认自动提交行为,默认值:true
auto-commit: true
其实没改多少东西,将数据源类型替换成HikariDataSource,然后配置下hikari的初始化参数即可。
关于Hikari的一些配置项,你可以参考这里 没官网直接看Github ReadeMe吧
看着这名字,看着这句 光HikariCP It's Faster. 我以为这老哥是个日本小哥。。。。