SpringBoot2升级SpringBoot3完整流程及避坑指南
前言
Spring Boot 2 升级到 Spring Boot 3,千万不要以为只是把 pom.xml 里的版本号改一下这么简单。
这次升级的核心变化可以概括成一句话:
Spring Boot 2 升 3,本质上是 Java 17 + Spring Framework 6 + Jakarta EE 的一次整体迁移。
也就是说,项目不仅要升级 Spring Boot,还要同步处理 JDK、依赖包、第三方 starter、配置项、包名变化等一堆兼容问题。
如果你的项目里用了 MyBatis-Plus、MySQL、Redis,那么最容易踩坑的地方主要有三个:
- MyBatis-Plus starter 需要换成 Spring Boot 3 专用版本;
- MySQL 驱动坐标发生变化;
- Redis 配置前缀从
spring.redis.*改成了spring.data.redis.*。
下面就按实际升级流程,把需要注意的地方完整梳理一遍。
一、不要直接从 Spring Boot 2.x 跳到 Spring Boot 3
如果项目还停留在 Spring Boot 2.3、2.4、2.5 这种比较老的版本,建议不要直接硬升到 Spring Boot 3。
更稳的升级路线是:
Spring Boot 2.x ↓ 先升级到 Spring Boot 2.7.x 最新版 ↓ 解决 deprecated、warning 和兼容问题 ↓ JDK 升级到 17 ↓ 再升级到 Spring Boot 3.x
为什么要这样做?
因为 Spring Boot 3 的底层是 Spring Framework 6,并且要求 Java 17+。如果你从比较老的 Spring Boot 2.x 直接跳到 3.x,很多问题会一起爆出来,很难判断到底是 JDK 问题、Spring 问题,还是第三方依赖问题。
所以比较稳妥的方式是:先把 Spring Boot 2.x 项目升级到 2.7.x,把旧问题解决掉,再进入 Spring Boot 3 的迁移阶段。
二、JDK 必须升级到 17+
Spring Boot 3 最基本的要求就是:
Java 17+
如果你还在用 Java 8 或 Java 11,项目会直接启动失败,甚至编译阶段就过不去。
在升级之前,先检查本地环境:
java -version
Maven 环境也建议检查一下:
mvn -v
如果 mvn -v 显示的 Java 版本不是 17,也可能导致你明明本地装了 JDK 17,但 Maven 编译时还是用旧 JDK。
三、最大变化:javax 全面迁移到 jakarta
Spring Boot 3 使用 Jakarta EE,很多包名从 javax.* 变成了 jakarta.*。
常见变化如下:
javax.servlet.* javax.validation.* javax.annotation.* javax.persistence.*
需要改成:
jakarta.servlet.* jakarta.validation.* jakarta.annotation.* jakarta.persistence.*
比如参数校验里常见的写法:
import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull;
要改成:
import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull;
再比如:
import javax.annotation.Resource;
要改成:
import jakarta.annotation.Resource;
当然,如果你不想继续用 @Resource,也可以改成 Spring 的:
@Autowired
不过需要注意,@Resource 和 @Autowired 的注入规则并不完全一样。老项目里如果大量使用 @Resource,建议不要一次性全改,先保证项目能跑起来,再逐步优化。
四、MyBatis-Plus 要换 Spring Boot 3 专用 starter
这是升级过程中非常容易炸的地方。
Spring Boot 2 项目里常见的 MyBatis-Plus 依赖是:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>到了 Spring Boot 3,应该换成:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.16</version>
</dependency>也就是说:
mybatis-plus-boot-starter
要换成:
mybatis-plus-spring-boot3-starter
这个不是名字好不好看的问题,而是 Spring Boot 3 底层已经换成 Spring Framework 6 和 Jakarta 体系,旧 starter 很容易出现兼容性问题。
1. 不要重复引入 MyBatis 原生 starter
引入 MyBatis-Plus 后,一般不要再单独引入 MyBatis 原生 starter,例如:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>否则可能会出现版本冲突、Mapper 扫描异常、Bean 重复注册等问题。
建议全局检查这些依赖:
mybatis-plus-boot-starter mybatis-plus-spring-boot3-starter mybatis-spring-boot-starter mybatis-spring
MyBatis-Plus 和 MyBatis 原生 starter 混着用,属于老项目升级时的经典雷区。
2. 分页插件、多租户、动态表名要注意
如果项目里用了 MyBatis-Plus 的分页插件、多租户插件、动态表名插件等,还要注意 mybatis-plus-jsqlparser。
可以这样配置:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-bom</artifactId>
<version>3.5.16</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- 如果用了分页、多租户、动态表名等插件,建议加上 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
</dependency>
</dependencies>这样版本交给 BOM 统一管理,后续升级也更方便。
五、MySQL 驱动坐标要改
Spring Boot 2 老项目中,经常能看到这种 MySQL 驱动写法:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>Spring Boot 3 中建议改成:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>也就是从:
mysql:mysql-connector-java
改成:
com.mysql:mysql-connector-j
application.yml 里的数据源配置一般可以继续这样写:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driverdriver-class-name 理论上可以省略,因为 Spring Boot 可以自动识别。但老项目升级时,我建议先保留,等项目跑通后再考虑精简配置。
六、Redis 配置前缀变了
Spring Boot 2 里,Redis 配置一般是这样:
spring:
redis:
host: localhost
port: 6379
password:
database: 0Spring Boot 3 里要改成:
spring:
data:
redis:
host: localhost
port: 6379
password:
database: 0变化点就是:
spring.redis.*
改成:
spring.data.redis.*
如果你项目里用了 Lettuce 连接池,Spring Boot 3 下可以这样写:
spring:
data:
redis:
host: localhost
port: 6379
database: 0
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 1000ms升级后如果你发现 Redis 配置不生效,先别急着怀疑 Redis 服务,优先检查是不是还在用旧的 spring.redis.*。
七、Redis 序列化不要随便改
Redis 配置前缀需要改,但 Redis 序列化方式不要随便改。
很多老项目里 Redis 存的数据可能是:
JDK 原生序列化 FastJson 序列化 Jackson JSON 序列化 带 @class 类型信息的 JSON 自定义序列化格式
如果升级 Spring Boot 3 的时候,顺手把 RedisTemplate 的序列化器也改了,可能会出现这些问题:
反序列化失败 缓存读取失败 登录态失效 验证码失效 Session 全部掉线
所以我的建议是:
第一阶段:只升级 Spring Boot 和依赖,RedisTemplate 序列化方式先保持不变。 第二阶段:等项目稳定运行后,再考虑统一 Redis 序列化方案。
如果 Redis 里只是普通缓存,清掉问题不大。
但如果 Redis 里存的是登录态、验证码、订单临时状态、限流数据,就千万别莽。
八、常见报错和对应原因
升级 Spring Boot 3 的过程中,可以根据报错快速定位问题。
| 报错 | 大概率原因 |
|---|---|
ClassNotFoundException: javax.servlet... | 没有把 javax.servlet 改成 jakarta.servlet |
ClassNotFoundException: javax.validation... | 没加 spring-boot-starter-validation,或者没改成 jakarta.validation |
Invalid value type for attribute 'factoryBeanObjectType': java.lang.String | MyBatis / MyBatis-Plus / MyBatis-Spring 版本不兼容 |
Invalid bound statement not found | Mapper XML 路径、Mapper 扫描路径或 MyBatis-Plus 配置有问题 |
Failed to configure a DataSource | MySQL 驱动坐标或数据源配置有问题 |
| Redis 配置不生效 | 还在使用 spring.redis.* |
| 分页插件不生效 | MyBatis-Plus 插件配置没迁移,或缺少 mybatis-plus-jsqlparser |
| 启动提示 Bean 重复 | MyBatis 和 MyBatis-Plus 依赖重复引入 |
其中比较典型的是这个错误:
Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
这个错误经常出现在 Spring Boot 3.2.x 项目里,根本原因通常是旧版本 MyBatis、MyBatis-Spring 或 MyBatis-Plus 与 Spring Framework 6.1 不兼容。
解决方向不是乱改业务代码,而是先检查依赖:
mybatis-plus-boot-starter mybatis-plus-spring-boot3-starter mybatis-spring-boot-starter mybatis-spring
确保使用 Spring Boot 3 兼容版本,并删除重复依赖。
九、推荐 pom.xml 结构
下面是一个比较常见的 Spring Boot 3 + MyBatis-Plus + MySQL + Redis 的 pom 配置示例:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.13</version>
<relativePath/>
</parent>
<properties>
<java.version>17</java.version>
<mybatis-plus.version>3.5.16</mybatis-plus.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-bom</artifactId>
<version>${mybatis-plus.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus for Spring Boot 3 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- 如果用了分页、多租户、动态表名等插件,建议加上 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 参数校验:如果用了 @Valid / @NotBlank / @NotNull,需要加 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>如果你项目是从 Spring Boot 2.3.6 升到 Spring Boot 3.2.6,也可以把 parent 版本改成:
<version>3.2.6</version>
不要盲目复制版本号,最好结合项目实际情况和官方兼容表选择。
十、升级前建议全局搜索这些关键词
迁移前,建议直接在项目里全局搜索:
javax. spring.redis mysql-connector-java mybatis-plus-boot-starter mybatis-spring-boot-starter mybatis-spring
如果项目里有 Swagger、Spring Security、Knife4j,还要继续搜:
springfox swagger knife4j WebSecurityConfigurerAdapter
因为 Spring Boot 3 对 Spring Security、Swagger 这类生态依赖的影响也很大。
例如:
Spring Security 5 → Spring Security 6 Springfox → springdoc-openapi 2.x 旧版 Knife4j → Boot3 兼容版本
这些不一定每个项目都会遇到,但只要项目里用了,就要单独处理。
十一、我的升级检查清单
最后整理一份升级检查清单,按这个顺序排查会比较稳:
1. 确认 JDK 是否为 17+ 2. 确认 Maven 版本是否满足要求 3. Spring Boot 2.x 先升级到 2.7.x 4. 解决旧版本中的 deprecated 和 warning 5. Spring Boot parent 改成 3.x 6. 全项目 javax.* 改成 jakarta.* 7. MyBatis-Plus starter 换成 mybatis-plus-spring-boot3-starter 8. 删除重复的 mybatis-spring-boot-starter 9. MySQL 驱动改成 com.mysql:mysql-connector-j 10. Redis 配置从 spring.redis 改成 spring.data.redis 11. RedisTemplate 序列化方式先不要乱改 12. 检查 Mapper XML 路径和 MapperScan 配置 13. 如果使用分页插件,检查 mybatis-plus-jsqlparser 14. 如果使用 Spring Security,单独迁移 Security 6 15. 如果使用 Swagger,优先考虑 springdoc-openapi 2.x 16. 最后进行完整回归测试
总结
Spring Boot 2 升级到 Spring Boot 3,最核心的不是改版本号,而是处理整个技术栈的兼容性。
可以记住这几个重点:
Java 17+ javax → jakarta MyBatis-Plus 换 Boot3 starter MySQL 驱动换新坐标 Redis 配置前缀改成 spring.data.redis 第三方 starter 必须确认 Boot3 兼容性
如果只改 Spring Boot 版本,不处理这些细节,项目很容易出现启动失败、Bean 初始化失败、Redis 配置不生效、Mapper 找不到、数据库连接失败等问题。
我的建议是:不要一次性把所有东西都改完。
升级这种事,最好一层一层来:
先环境 再依赖 再配置 再代码 最后测试
这样遇到问题时,定位会清晰很多,也不容易把自己绕进去。
以上就是SpringBoot2升级SpringBoot3完整流程及避坑指南的详细内容,更多关于SpringBoot2升级SpringBoot3流程的资料请关注脚本之家其它相关文章!
相关文章
Java工具之ja-netfilter 2022.1 配置教程
这篇文章主要介绍了Java工具之ja-netfilter 2022.1 配置教程,本防火墙基于javaagent,所以目前只有基于java的程序能够使用,需要的朋友可以参考下2022-04-04
maven的pom.xml中repositories和distributionManagement使用
这篇文章主要介绍了maven的pom.xml中repositories和distributionManagement使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-03-03


最新评论