MoshiCoCo
发布于 2023-05-08 / 224 阅读
0
0

SpringBoot2.7x升级至SpringBoot3.x小记

最近将自己的个人项目(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连接池吧,之前只是听说过,但是没用过。

  1. 更新 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 了

  1. 升级下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 做的多数据源切换,所以随手升级了下。

  1. 修改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. 我以为这老哥是个日本小哥。。。。


评论