Spring Boot 2 → 4 升级计划
状态:Draft
创建时间:2025-07-18
Issue Type: feature
Problem Statement
Fun-Project 当前使用 Spring Boot 2.6.3(已于 2022 年停止维护),存在以下问题:
- 安全风险:Spring Boot 2.x 已停止安全更新,存在已知漏洞
- 依赖过旧:Spring Cloud 2021.0.1、Spring Cloud Alibaba 2021.1 等依赖版本过旧
- JDK 限制:当前使用 JDK 1.8,无法使用现代 Java 特性(Records、Pattern Matching、Virtual Threads 等)
- Spring Security OAuth2 过时:使用已废弃的
spring-security-oauth2 库,需要迁移到 Spring Authorization Server
- 技术债务:大量
javax.* 引用需要迁移到 jakarta.*
升级到 Spring Boot 3.2.x(或 4.x 稳定版)是所有后续功能开发的前置条件。
Solution
将项目从 Spring Boot 2.6.3 升级到 Spring Boot 3.2.x,同步升级所有配套依赖,确保现有功能正常运行。
版本映射
| 组件 |
当前版本 |
目标版本 |
| JDK |
1.8 |
17 |
| Spring Boot |
2.6.3 |
3.2.x |
| Spring Cloud |
2021.0.1 |
2023.0.x |
| Spring Cloud Alibaba |
2021.1 |
2023.0.x |
| MyBatis-Plus |
3.5.1 |
3.5.5+ |
| SpringDoc |
1.6.6 |
2.3.0+ |
| Druid |
1.2.8 |
1.2.20+ |
| Spring Security OAuth2 |
旧版 |
移除,使用 Spring Authorization Server |
| Spring Boot Admin |
2.6.7 |
3.2.x |
User Stories
Phase 1: JDK 升级
- 作为开发者,我希望将 JDK 从 1.8 升级到 17,以便使用现代 Java 特性
- 作为开发者,我希望修改
pom.xml 中的 maven.compiler.source/target 为 17,以便项目使用 JDK 17 编译
- 作为开发者,我希望修复 JDK 17 不兼容的代码,以便项目能在 JDK 17 上正常运行
Phase 2: javax → jakarta 迁移
- 作为开发者,我希望将所有
javax.servlet 替换为 jakarta.servlet,以便兼容 Jakarta EE 9+
- 作为开发者,我希望将所有
javax.validation 替换为 jakarta.validation,以便兼容 Bean Validation 3.0
- 作为开发者,我希望将所有
javax.annotation 替换为 jakarta.annotation,以便兼容 Jakarta Annotations 2.0
- 作为开发者,我希望将所有
javax.persistence 替换为 jakarta.persistence,以便兼容 JPA 3.0
- 作为开发者,我希望将所有
javax.sql 保留不变,因为 javax.sql.DataSource 未迁移
Phase 3: Spring Boot 升级
- 作为开发者,我希望将
spring-boot.version 从 2.6.3 升级到 3.2.x,以便使用最新特性
- 作为开发者,我希望将
spring-cloud.version 从 2021.0.1 升级到 2023.0.x,以便与 Boot 3 兼容
- 作为开发者,我希望将
spring-cloud-alibaba.version 从 2021.1 升级到 2023.0.x,以便与 Boot 3 兼容
- 作为开发者,我希望移除
spring-boot-starter-redis 依赖,因为 Boot 3 中已移除该 starter
- 作为开发者,我希望使用
spring-boot-starter-data-redis 替代,以便正确集成 Redis
Phase 4: Spring Security 迁移
- 作为开发者,我希望移除
spring-security-oauth2 依赖,因为该库已废弃
- 作为开发者,我希望引入
spring-boot-starter-oauth2-authorization-server,以便使用 Spring Authorization Server
- 作为开发者,我希望将
AuthorizationServerConfigurerAdapter 迁移到新版配置,以便兼容 Spring Security 6.x
- 作为开发者,我希望将
ResourceServerConfigurerAdapter 迁移到 SecurityFilterChain,以便兼容 Spring Security 6.x
- 作为开发者,我希望将
WebSecurityConfigurerAdapter 迁移到 SecurityFilterChain,以便兼容 Spring Security 6.x
- 作为开发者,我希望将
RedisTokenStore 迁移到新版实现,以便兼容 Spring Authorization Server
- 作为开发者,我希望将
RemoteTokenServices 迁移到新版实现,以便兼容 Spring Authorization Server
- 作为开发者,我希望保留现有的 OAuth2 客户端配置(
sys_oauth_client_details 表),以便平滑迁移
- 作为开发者,我希望保留现有的 Token 增强逻辑(
TokenEnhancer),以便平滑迁移
Phase 5: MyBatis-Plus 升级
- 作为开发者,我希望将 MyBatis-Plus 从 3.5.1 升级到 3.5.5+,以便与 Boot 3 兼容
- 作为开发者,我希望验证所有 MyBatis-Plus 注解(
@TableName、@TableId 等)正常工作
- 作为开发者,我希望验证所有 MyBatis-Plus 代码生成器正常工作
Phase 6: SpringDoc 升级
- 作为开发者,我希望将 SpringDoc 从 1.6.6 升级到 2.3.0+,以便与 Boot 3 兼容
- 作为开发者,我希望将
springdoc-openapi-webflux-ui 替换为 springdoc-openapi-starter-webflux-ui,以便使用新版 API
- 作为开发者,我希望验证 Swagger UI 正常访问
- 作为开发者,我希望验证动态 API 分组功能正常工作
Phase 7: 其他依赖升级
- 作为开发者,我希望将 Druid 从 1.2.8 升级到 1.2.20+,以便与 Boot 3 兼容
- 作为开发者,我希望将 Spring Boot Admin 从 2.6.7 升级到 3.2.x,以便与 Boot 3 兼容
- 作为开发者,我希望将 Hutool 从 5.4.1 升级到 5.8.x,以便使用最新特性
- 作为开发者,我希望将 Fastjson 从 1.2.78 升级到 Fastjson2 2.0.x,以便修复安全漏洞
- 作为开发者,我希望验证
multilevel-cache-spring-boot-starter 与 Boot 3 兼容
- 作为开发者,我希望验证
oss-spring-boot-starter 与 Boot 3 兼容
Phase 8: 配置文件迁移
- 作为开发者,我希望更新
application.yml 配置文件,以便兼容 Boot 3 配置格式
- 作为开发者,我希望更新
bootstrap.yml 配置文件,以便兼容 Boot 3 配置格式
- 作为开发者,我希望验证 Nacos 配置中心正常工作
- 作为开发者,我希望验证多环境配置(dev/test/prod)正常切换
Phase 9: 测试验证
- 作为开发者,我希望所有模块编译通过,以便确认依赖升级成功
- 作为开发者,我希望所有单元测试通过,以便确认代码迁移正确
- 作为开发者,我希望集成测试:登录流程正常工作
- 作为开发者,我希望集成测试:OAuth2 授权流程正常工作
- 作为开发者,我希望集成测试:网关路由正常工作
- 作为开发者,我希望集成测试:微服务间调用正常工作
- 作为开发者,我希望 Docker 镜像正常构建和运行
Phase 10: 文档更新
- 作为开发者,我希望更新 README.md,记录新的版本要求
- 作为开发者,我希望更新部署文档,记录 JDK 17 要求
- 作为开发者,我希望更新 docker-compose.yml,使用 JDK 17 基础镜像
Implementation Decisions
1. 升级策略:渐进式升级
决策:采用渐进式升级策略,分阶段完成,每阶段可独立验证。
理由:
- 一次性升级风险过高,问题难以定位
- 渐进式升级可以逐步验证每个模块
- 可以在升级过程中保持部分功能可用
2. JDK 版本选择:JDK 17
决策:选择 JDK 17 作为目标版本,而非 JDK 21。
理由:
- JDK 17 是 LTS 版本,长期支持
- Spring Boot 3.x 最低要求 JDK 17
- JDK 21 的 Virtual Threads 等特性可以后续再启用
- 降低升级风险
3. Spring Security OAuth2 迁移策略
决策:保留现有 OAuth2 业务逻辑,仅迁移配置类。
理由:
- 现有的
FunClientDetailsService、TokenEnhancer 等业务逻辑可以复用
- 只需迁移配置类(
AuthorizationServerConfigurerAdapter → 新版配置)
- 保留
sys_oauth_client_details 表结构
- 保留 Redis Token Store 方案
迁移映射:
AuthorizationServerConfigurerAdapter → @Bean RegisteredClientRepository + @Bean AuthorizationService
ResourceServerConfigurerAdapter → SecurityFilterChain
WebSecurityConfigurerAdapter → SecurityFilterChain
RedisTokenStore → RedisOAuth2AuthorizationService
RemoteTokenServices → OAuth2TokenIntrospectionClient
4. javax → jakarta 迁移方式
决策:使用 IDE 批量替换 + 手动验证。
理由:
- 项目中有 101 处
javax.* 引用
- 大部分是
javax.servlet、javax.validation、javax.annotation
javax.sql.DataSource 不需要迁移(属于 Java SE)
- 批量替换后需要逐模块验证
5. MyBatis-Plus 升级策略
决策:直接升级到 3.5.5+,无需修改业务代码。
理由:
- MyBatis-Plus 3.5.x 系列向后兼容
- 3.5.5+ 已支持 Boot 3
- 现有的
@TableName、@TableId 等注解无需修改
6. SpringDoc 升级策略
决策:从 SpringDoc 1.x 升级到 2.x,修改依赖和少量配置。
理由:
- SpringDoc 2.x 是 Boot 3 的官方支持版本
- API 注解(
@Operation、@Schema 等)无需修改
- 需要修改依赖名称:
springdoc-openapi-webflux-ui → springdoc-openapi-starter-webflux-ui
7. 模块升级顺序
决策:按依赖关系从底层到上层升级。
顺序:
fun-common-core(无外部依赖)
fun-common-validation(依赖 fun-common-core)
fun-common-web(依赖 fun-common-core)
fun-common-log(依赖 fun-common-core)
fun-common-security(依赖 fun-common-web)
fun-common-captcha(依赖 fun-common-web)
fun-common-cache(依赖 fun-common-core)
fun-api/fun-system-api(依赖 fun-common-core)
fun-config(配置模块)
fun-auth(依赖 fun-common-security)
fun-gateway(依赖 fun-common-core)
fun-service/fun-service-system(依赖 fun-api)
8. 向后兼容性
决策:不保留向后兼容性,直接升级到新版本。
理由:
- 项目已停止维护 2 年,无需考虑旧版本兼容
- 一次性升级到最新版本,避免技术债务累积
- 简化升级过程
Testing Decisions
测试策略
- 单元测试:验证每个模块的独立功能
- 集成测试:验证模块间交互
- 端到端测试:验证完整业务流程
测试优先级
| 优先级 |
测试内容 |
说明 |
| P0 |
编译测试 |
所有模块编译通过 |
| P0 |
启动测试 |
所有服务正常启动 |
| P1 |
登录测试 |
用户名密码登录正常 |
| P1 |
OAuth2 测试 |
Token 签发、验证正常 |
| P1 |
网关测试 |
路由转发正常 |
| P2 |
权限测试 |
RBAC 权限校验正常 |
| P2 |
缓存测试 |
多级缓存正常工作 |
| P3 |
Swagger 测试 |
API 文档正常访问 |
测试用例
编译测试
mvn clean compile -DskipTests
启动测试
# 启动 Nacos
docker-compose up -d fun-nacos fun-redis
# 启动各服务
mvn spring-boot:run -pl fun-auth
mvn spring-boot:run -pl fun-gateway
mvn spring-boot:run -pl fun-service/fun-service-system
登录测试
# 获取 Token
curl -X POST http://localhost:10000/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=password&username=admin&password=admin&client_id=fun&client_secret=fun"
# 验证 Token
curl http://localhost:10000/oauth/check_token?token=<token>
网关测试
# 通过网关访问服务
curl http://localhost:9000/fun-service-system/user/details/1 \
-H "Authorization: Bearer <token>"
Out of Scope
- Spring Boot 4.x:当前 Boot 4 尚未发布稳定版,先升级到 3.2.x
- JDK 21:Virtual Threads 等特性可以后续再启用
- 新功能开发:本次升级仅涉及版本迁移,不包含新功能
- 数据库 schema 变更:保留现有的表结构
- 前端变更:本次升级不影响前端
Further Notes
风险点
-
Spring Security OAuth2 变更较大
- 风险:配置类需要重写
- 缓解:保留业务逻辑,仅迁移配置类
-
第三方库兼容性
- 风险:部分库可能不兼容 Boot 3
- 缓解:提前验证兼容性,必要时寻找替代方案
-
Nacos 配置方式变化
- 风险:Boot 3 的配置加载方式有变化
- 缓解:参考 Spring Cloud Alibaba 官方文档
-
Spring Gateway 配置变化
- 风险:Gateway 的部分配置可能需要调整
- 缓解:参考 Spring Cloud Gateway 官方文档
参考文档
预估工时
| 阶段 |
工时 |
说明 |
| Phase 1: JDK 升级 |
0.5天 |
修改配置 |
| Phase 2: javax → jakarta |
1天 |
批量替换 + 验证 |
| Phase 3: Spring Boot 升级 |
1天 |
依赖升级 |
| Phase 4: Spring Security 迁移 |
2天 |
最复杂部分 |
| Phase 5: MyBatis-Plus 升级 |
0.5天 |
简单升级 |
| Phase 6: SpringDoc 升级 |
0.5天 |
简单升级 |
| Phase 7: 其他依赖升级 |
0.5天 |
简单升级 |
| Phase 8: 配置文件迁移 |
0.5天 |
配置调整 |
| Phase 9: 测试验证 |
1天 |
全面测试 |
| Phase 10: 文档更新 |
0.5天 |
更新文档 |
| 总计 |
8天 |
包含问题修复 |
Checklist
Spring Boot 2 → 4 升级计划
Problem Statement
Fun-Project 当前使用 Spring Boot 2.6.3(已于 2022 年停止维护),存在以下问题:
spring-security-oauth2库,需要迁移到 Spring Authorization Serverjavax.*引用需要迁移到jakarta.*升级到 Spring Boot 3.2.x(或 4.x 稳定版)是所有后续功能开发的前置条件。
Solution
将项目从 Spring Boot 2.6.3 升级到 Spring Boot 3.2.x,同步升级所有配套依赖,确保现有功能正常运行。
版本映射
User Stories
Phase 1: JDK 升级
pom.xml中的maven.compiler.source/target为 17,以便项目使用 JDK 17 编译Phase 2: javax → jakarta 迁移
javax.servlet替换为jakarta.servlet,以便兼容 Jakarta EE 9+javax.validation替换为jakarta.validation,以便兼容 Bean Validation 3.0javax.annotation替换为jakarta.annotation,以便兼容 Jakarta Annotations 2.0javax.persistence替换为jakarta.persistence,以便兼容 JPA 3.0javax.sql保留不变,因为javax.sql.DataSource未迁移Phase 3: Spring Boot 升级
spring-boot.version从 2.6.3 升级到 3.2.x,以便使用最新特性spring-cloud.version从 2021.0.1 升级到 2023.0.x,以便与 Boot 3 兼容spring-cloud-alibaba.version从 2021.1 升级到 2023.0.x,以便与 Boot 3 兼容spring-boot-starter-redis依赖,因为 Boot 3 中已移除该 starterspring-boot-starter-data-redis替代,以便正确集成 RedisPhase 4: Spring Security 迁移
spring-security-oauth2依赖,因为该库已废弃spring-boot-starter-oauth2-authorization-server,以便使用 Spring Authorization ServerAuthorizationServerConfigurerAdapter迁移到新版配置,以便兼容 Spring Security 6.xResourceServerConfigurerAdapter迁移到SecurityFilterChain,以便兼容 Spring Security 6.xWebSecurityConfigurerAdapter迁移到SecurityFilterChain,以便兼容 Spring Security 6.xRedisTokenStore迁移到新版实现,以便兼容 Spring Authorization ServerRemoteTokenServices迁移到新版实现,以便兼容 Spring Authorization Serversys_oauth_client_details表),以便平滑迁移TokenEnhancer),以便平滑迁移Phase 5: MyBatis-Plus 升级
@TableName、@TableId等)正常工作Phase 6: SpringDoc 升级
springdoc-openapi-webflux-ui替换为springdoc-openapi-starter-webflux-ui,以便使用新版 APIPhase 7: 其他依赖升级
multilevel-cache-spring-boot-starter与 Boot 3 兼容oss-spring-boot-starter与 Boot 3 兼容Phase 8: 配置文件迁移
application.yml配置文件,以便兼容 Boot 3 配置格式bootstrap.yml配置文件,以便兼容 Boot 3 配置格式Phase 9: 测试验证
Phase 10: 文档更新
Implementation Decisions
1. 升级策略:渐进式升级
决策:采用渐进式升级策略,分阶段完成,每阶段可独立验证。
理由:
2. JDK 版本选择:JDK 17
决策:选择 JDK 17 作为目标版本,而非 JDK 21。
理由:
3. Spring Security OAuth2 迁移策略
决策:保留现有 OAuth2 业务逻辑,仅迁移配置类。
理由:
FunClientDetailsService、TokenEnhancer等业务逻辑可以复用AuthorizationServerConfigurerAdapter→ 新版配置)sys_oauth_client_details表结构迁移映射:
AuthorizationServerConfigurerAdapter→@Bean RegisteredClientRepository+@Bean AuthorizationServiceResourceServerConfigurerAdapter→SecurityFilterChainWebSecurityConfigurerAdapter→SecurityFilterChainRedisTokenStore→RedisOAuth2AuthorizationServiceRemoteTokenServices→OAuth2TokenIntrospectionClient4. javax → jakarta 迁移方式
决策:使用 IDE 批量替换 + 手动验证。
理由:
javax.*引用javax.servlet、javax.validation、javax.annotationjavax.sql.DataSource不需要迁移(属于 Java SE)5. MyBatis-Plus 升级策略
决策:直接升级到 3.5.5+,无需修改业务代码。
理由:
@TableName、@TableId等注解无需修改6. SpringDoc 升级策略
决策:从 SpringDoc 1.x 升级到 2.x,修改依赖和少量配置。
理由:
@Operation、@Schema等)无需修改springdoc-openapi-webflux-ui→springdoc-openapi-starter-webflux-ui7. 模块升级顺序
决策:按依赖关系从底层到上层升级。
顺序:
fun-common-core(无外部依赖)fun-common-validation(依赖 fun-common-core)fun-common-web(依赖 fun-common-core)fun-common-log(依赖 fun-common-core)fun-common-security(依赖 fun-common-web)fun-common-captcha(依赖 fun-common-web)fun-common-cache(依赖 fun-common-core)fun-api/fun-system-api(依赖 fun-common-core)fun-config(配置模块)fun-auth(依赖 fun-common-security)fun-gateway(依赖 fun-common-core)fun-service/fun-service-system(依赖 fun-api)8. 向后兼容性
决策:不保留向后兼容性,直接升级到新版本。
理由:
Testing Decisions
测试策略
测试优先级
测试用例
编译测试
启动测试
登录测试
网关测试
Out of Scope
Further Notes
风险点
Spring Security OAuth2 变更较大
第三方库兼容性
Nacos 配置方式变化
Spring Gateway 配置变化
参考文档
预估工时
Checklist
feature/springboot3-upgradepom.xml版本号