🚨 Spring Boot 3.x 4.0 迁移:到底出了什么问题(以及我们是如何修复的)
Source: Dev.to
Jakarta 命名空间问题
症状
即使在 Spring Boot 3.x 中已迁移到 Jakarta,仍有一些传递性依赖会拉入 javax.* 类。常见的罪魁祸首包括:
- 旧的验证库
- SOAP / JAXB 工具
- 传统的 servlet 过滤器
解决方案
mvn dependency:tree | grep javax
然后:
- 强制使用兼容 Jakarta 的版本。
- 明确排除旧的传递性依赖。
经验教训: “在 3.x 能用” 并不意味着在 4.0 中安全。
Spring Security 配置变更
症状
Spring Boot 4 时代的 Spring Security 要求完全显式的配置。出现问题的地方:
- 已废弃的 DSL 被移除。
- 默认值改变(尤其是 CSRF 与会话处理)。
- 自定义过滤器不再自动注册。
解决方案
改用显式的 SecurityFilterChain Bean,停止依赖默认配置。
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
return http.build();
}
经验教训: 隐式的安全配置已经消失;要么显式配置,要么会被惊到。
Starter 重命名、拆分与移除
症状
多个 Spring Boot starter 被重命名、拆分或直接移除,尤其是以下领域:
- 可观测性
- Actuator 扩展
- 传统集成
解决方案
手动审计你的 starter 列表;不要盲目信任旧的清单。
mvn dependency:tree | grep spring-boot-starter
将被移除的 starter 替换为:
- 显式的库,或
- 新的模块化替代品。
Java 基线不匹配(Java 21+)
症状
Spring Boot 4.0 更加推动现代 Java(Java 21+)。出现问题的地方:
- Testcontainers 镜像
- ByteBuddy / Mockito 兼容性
- JVM 参数被移除或被忽略
解决方案
- 对齐本地 Java 版本、CI Java 版本以及 Maven toolchains。
- 积极升级测试库。
经验教训: 当出现 Spring 错误时,先检查是否是 JVM 版本不匹配。
可观测性默认值重构
症状
Spring Boot 4 重构了可观测性默认值:
- 端点默认关闭
- 指标名称被重命名
- 曝露规则不同
解决方案
显式重新声明 actuator 曝露设置:
management:
endpoints:
web:
exposure:
include: health,info,metrics
经验教训: “没有错误” 并不等于 “正常工作”。
迁移检查清单与进一步阅读
我们已将每一个破坏性变更、解决方案和坑点整理成结构化的迁移检查清单。
完整的 Spring Boot 3.x → 4.0 迁移指南
🔗
内容包括:
- 依赖审计步骤
- 安全迁移模式
- 测试与 CI 修复
- Actuator 与可观测性变更
我们正在构建一个真实迁移案例的小目录(非营销文档):
🔗
如果你正在处理 Spring Boot 升级、Java 版本跨越或框架迁移,那里可能会有对你有用的内容。
在你的 Spring Boot 升级过程中,最奇怪的破坏点是什么?
静默的行为变化?
来一起交流经验吧 👇