升级SpringBoot3
SpringBoot的发布日历

SpringBoot3在2022年发布,到目前已经经历了很长的时间了,而SpringBoot2版本已经结束了维护,与jdk的发版节奏类似,后续必将是一个快速更迭的节奏,为了更好的适应和跟上脚步,所以我们需要升级到SpringBoot版本。
迁移计划
注意
以下是针对公司内部项目的升级变化,并不是整个spring家族的升级变化,需要查看完整的请查看Spring Boot 3.0 Migration Guide
目前我们的重要组件的版本如下:
| 组件 | 旧版本 | 备注 |
|---|---|---|
| JDK | 11 | |
| gradle-plugin | 0.1.3 | 内部插件 |
| SpringBoot | 2.7.18 | |
| springcloud | 2021.0.5 | |
| spring cloud alibaba | 2021.0.4.0 | |
| cosid | 1.14.6 | |
| satoken | 1.38.0 | |
| jakartaServletApi | 4.0.1 | |
| jakartaValidationApi | 2.0.1.Final | |
| io.spring.dependency-management | 1.1.4 | |
| mybatis-plus | 3.5.7 |
本着准备升的不管坑多不多一定都要升,管坑的人一般不升级的原则,围绕着Spring Boot 3.0 Migration Guide 指南升级,针对我们的情况,做个建议计划,不能一下子就升级到最新的版本,这样可能会有很多问题,我们的计划按两个步骤走,
- 升级JDK版本到21
- 升级SpringBoot版本到3
JDK升级21
由于我们已经处在SpringBoot2的最后一个版本(2.7.18),把相关的一些变更都已经踩踏完毕(主要是配置方式),并且支持JDK版本8 ~ 21 ,SpringBoot3最低支持JDK17,所以我们先升级JDK版本到21(嗯 是这么个逻辑)。
SpringBoot升级3
这里主要是SpringBoot3的变化了,会详细记录
版本差异
| 组件 | 版本 | 旧版本 | 备注 |
|---|---|---|---|
| JDK | 21 | 11 | |
| gradle-plugin | 17.0.1 | 0.1.3 | 内部插件 |
| springboot | 3.3.5 | 2.7.18 | |
| springcloud | 2023.0.3 | 2021.0.5 | |
| spring cloud alibaba | 2023.0.1.3 | 2021.0.4.0 | |
| cosid | 2.9.9 | 2.9.1 | |
| satoken | 1.38.0 | 1.38.0 | |
| jakartaServletApi | 6.1.0 | 4.0.1 | 依赖变化 cn.dev33:sa-token-spring-boot3-starter |
| jakartaValidationApi | 2.0.1.Final | 3.1.0 | |
| io.spring.dependency-management | 1.1.6 | 1.1.4 | |
| mybatis-plus | 3.5.9 | 3.5.7 |
修改点
配置迁移
3版本的一大变化还是有配置项,SpringBoot贴心的提供了一个依赖项来帮助快速调整配置项,在项目里引入即可,不过在最新的IDEA中,已经有识别配置异常情况了,直接使用IDEA就可以解决配置问题,哪种方式根据喜好来。
// 可在自己项目里定义
implementation(libs.fashion.drawer.sdk)runtime("org.springframework.boot:spring-boot-properties-migrator")
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>我们需要修改 spring.redis 已移至 spring.data.redis。这是一个强制破坏性的变化,所以只要编译就能发现错误,好改。

升级到 Jakarta EE
由于Oracle将 Java EE 捐给了Eclipse基金会,由于商标版权问题, Java EE 已更名为 Jakarta EE,Spring Boot 3.x 的所有依赖 API 也相应升级。这意味着您需要将项目中所有javax.*包的引用替换为jakarta.*包。这一变化是全局性的,因此需要在整个项目中进行更新。 这是一个强制破坏性的变化,所以只要编译就能发现错误,好改。
javax.persistence.* -> jakarta.persistence.*
javax.validation.* -> jakarta.validation.*
javax.servlet.* -> jakarta.servlet.*
javax.annotation.* -> jakarta.annotation.*
javax.transaction.* -> jakarta.transaction.*提示
这个几乎是SpringBoot3最大最具破坏性的修改点,因为不兼容,几乎后续的大部分的修改都是为了应对这个变更的,特别是依赖的第三方组件都需要额外的针对3这个版本做适配,。
我们需要是validation相关的多个依赖,这是一个强制破坏性的变化,所以只要编译就能发现错误,好改。
IDEA 可通过菜单 'Refactor' - 'Migrate Packages and Classes' - 'Java EE to Jarkata EE' 进行迁移
#### hutool使用问题
如果需要使用相应的HttpServletRequest的内容需要切换工具类:
```bash
ServletUtil ---> JakartaServletUtilsa-token
sa-token在3版本中有了一些变化,主要是依赖的变化,
sa-token-spring-boot-starter --> sa-token-spring-boot3-starter需要引入新的依赖:
提示
如果使用gradle则不需要关心依赖坐标的变更,基础框架内部已经映射,maven需要自行修改。
implementation(commonLibs.sa.token.starter)implementation("cn.dev33:sa-token-spring-boot3-starter:${latestVersion}")<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId> // 注意这里
<version>${latestVersion}</version>
</dependency>mybatis-plus
mybatis-plus在3.5.9版本中存在部分依赖变化,
com.baomidou:mybatis-plus-boot-starter --> com.baomidou:mybatis-plus-spring-boot3-starter
// 拦截器相关类移动到,使用需添加
com.baomidou:mybatis-plus-jsqlparser需要引入新的依赖:
提示
如果使用gradle则不需要关心依赖坐标的变更,基础框架内部已经映射,maven需要自行修改。
implementation(libs.mybatis.plus.boot.starter)implementation("com.baomidou:mybatis-plus-spring-boot3-starter:${latestVersion}")
implementation("com.baomidou:mybatis-plus-jsqlparser:${latestVersion}")<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId> // 注意这里
<version>${latestVersion}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId> // 注意这里
<version>${latestVersion}</version>
</dependency>Kotlin
旧有的
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
jvmTarget = project.properties["kotlinJvmTarget"]?.toString() ?: "21"
}
}修改为:
kotlin {
compilerOptions {
freeCompilerArgs.addAll("-Xjsr305=strict")
jvmTarget.set(JvmTarget.JVM_21)
}
}LocalVariableTableParameterNameDiscoverer 废弃
获取方法参数名称LocalVariableTableParameterNameDiscoverer在SpringBoot3以废弃替换为StandardReflectionParameterNameDiscoverer
见 Remove LocalVariableTableParameterNameDiscoverer
@ConstructorBinding变化
不能被注释在类上了,直接去掉,新版SpringBoot已经能够自动从构造函数获取参数了。
见springboot 3: ConstructorBinding does not work with kotlin primary constructor
