JeecgBoot 从 Spring Boot 3.5.5 升级到 4.1.0 (Spring Framework 7.x) 的兼容性修复记录
升级概述
| 项目 |
旧版本 |
新版本 |
| Spring Boot |
3.5.5 |
4.1.0 |
| Spring Framework |
6.x |
7.x |
| Java |
17 |
17 |
编译期修复
1. 实体字段名不匹配导致 getter 不存在
文件: OpenApiController.java
openApi.getBody() → openApi.getRequestBody()
原因: 实体 OpenApi 字段名为 requestBody,Lombok 生成的是 getRequestBody(),原来写错了方法名。
2. HttpHeaders 改为 final 类,禁止匿名子类
文件: Response.java
// ❌ Spring Framework 7: HttpHeaders 是 final
new HttpHeaders() { { put("Content-Type", contentType); } };
// ✅ 标准写法
HttpHeaders headers = new HttpHeaders();
headers.put("Content-Type", contentType);
3. ResponseEntity.getStatusCodeValue() 已移除
文件: HttpNode.java
responseEntity.getStatusCodeValue() → responseEntity.getStatusCode().value()
4. MediaType.APPLICATION_JSON_UTF8_VALUE 已移除
文件: 多个文件
MediaType.APPLICATION_JSON_UTF8_VALUE → MediaType.APPLICATION_JSON_VALUE
原因: Spring 5.3+ JSON 默认就是 UTF-8 (RFC 8259)。
5. HttpHeaders.containsKey() 已移除
文件: HttpNode.java, ToolsNode.java
// ❌
headers.containsKey(HttpHeaders.CONTENT_LENGTH)
headers.containsKey(HttpHeaders.CONTENT_TYPE)
// ✅
headers.getContentLength() == -1
headers.getContentType() == null
6. HttpComponentsClientHttpRequestFactory 超时方法已移除
文件: HttpNode.java
HttpComponentsClientHttpRequestFactory → SimpleClientHttpRequestFactory
7. UriComponentsBuilder.fromHttpUrl() 已移除
文件: BraveSearchToolBuilder.java
UriComponentsBuilder.fromHttpUrl(...) → UriComponentsBuilder.fromUriString(...)
运行时修复
8. Redis 容器 Bean 冲突
文件: DragWebSocket.java
// ❌ 两个 bean: redisContainer vs redisMessageListenerContainer
@Autowired(required = false)
private RedisMessageListenerContainer container;
// ✅ 指定 bean
@Qualifier("redisContainer")
@Autowired(required = false)
private RedisMessageListenerContainer container;
9. MongoDB 配置键改名
配置: application-*.yml (10个文件)
spring.data.mongodb.uri → spring.mongodb.uri
10. server.error.include-* 属性全部移除
配置: application-*.yml (10个文件)
删除以下三个已废弃属性:
server.error.include-exception
server.error.include-message
server.error.include-stacktrace
教训总结
做对的
- 先编译再运行,逐步修复编译错误
- 识别出哪些是 Spring Boot 4 兼容问题,哪些是已有项目缺失依赖
做错的
- YAML 批量修改用 Python 脚本不够谨慎 — 正则替换极易破坏缩进和注释,导致
mybatis 变成 ybatis、注释 # 丢失、缩进错位
- 第一次测试脚本后没有再验证 — 脚本逻辑有 bug 导致数据被破坏
- 重复修改同一个文件多次 — 应该先备份,好则保留、不好则回退
- YAML 修改没有使用专门工具 — Python 脚本拼接字符串做 YAML 编辑是高风险操作,应优先用结构化的 YAML 解析库
正确做法(下次升级参考)
- 编译期: 用
mvn clean compile 发现所有错误 → 逐个 Java 文件用 Edit 工具精确替换
- 运行时: 启动应用 → 根据 Spring Boot migration guide 逐个修复配置 key
- YAML 修改: 不要用字符串替换,用
ruamel.yaml 或 snakeyaml 做结构化读写
- 修改前先备份:
git stash 或简单拷贝
- 每次修改后立即验证: 读文件确认效果
日期: 2026-07-07
项目: JeecgBoot 3.9.3 → Spring Boot 4.1.0