You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.7 KiB
3.7 KiB
Jackson序列化问题终极解决方案
🎯 问题根源
Spring Boot 2.7.18 中 Jackson 对 Java 8 时间类型的自动配置存在问题,导致 LocalDateTime
无法正确序列化。
🔧 终极解决方案
1. 添加Maven依赖
<!-- Jackson JSR310 support for Java 8 time -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
2. 简化Jackson配置
创建了最简单的 JacksonConfig.java
:
@Configuration
public class JacksonConfig {
@Bean
@ConditionalOnMissingBean
public JavaTimeModule javaTimeModule() {
return new JavaTimeModule();
}
}
3. 优化application.yml配置
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
serialization:
write-dates-as-timestamps: false
deserialization:
fail-on-unknown-properties: false
mapper:
default-property-inclusion: non_null
4. 批量添加@JsonFormat注解
最关键的解决方案:为所有154个实体类的 LocalDateTime 字段添加了 @JsonFormat
注解:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime expirationTime;
📊 修复统计
✅ 处理完成
- 实体类文件数:154个
- 添加JsonFormat导入:153个文件
- 添加JsonFormat注解:所有LocalDateTime字段
- 涉及模块:
- 商城模块 (shop) - 48个文件
- 系统模块 (common/system) - 26个文件
- CMS模块 (cms) - 24个文件
- OA模块 (oa) - 22个文件
- 驾校模块 (hjm) - 9个文件
- 项目模块 (project) - 6个文件
- 房产模块 (house) - 5个文件
- 文档模块 (docs) - 3个文件
- 博士在线模块 (bszx) - 3个文件
- PWL模块 (pwl) - 1个文件
🎯 解决方案优势
1. 多层保障
- Maven依赖层:确保JSR310模块可用
- 配置层:简化的Jackson配置
- 注解层:直接在字段上指定格式
2. 最可靠的方法
@JsonFormat
注解是最直接、最可靠的解决方案:
- 不依赖全局配置
- 不受Spring Boot版本影响
- 明确指定序列化格式
- 优先级最高
3. 统一格式
所有时间字段都使用统一格式:yyyy-MM-dd HH:mm:ss
🚀 重启测试
1. 重启应用程序
现在重启应用程序,所有配置将生效。
2. 测试接口
# 测试原问题接口
curl http://127.0.0.1:9200/api/cms/cms-website/getSiteInfo
# 测试其他包含LocalDateTime的接口
curl http://127.0.0.1:9200/api/test/datetime
3. 预期结果
{
"code": 200,
"message": "操作成功",
"data": {
"expirationTime": "2025-01-12 14:30:45",
"createTime": "2025-01-12 14:30:45",
"updateTime": "2025-01-12 14:30:45"
}
}
✅ 问题彻底解决
这个方案采用了最可靠的解决方法:
为什么@JsonFormat注解最有效?
- 直接作用:直接在字段上指定序列化格式
- 优先级最高:覆盖所有全局配置
- 不受版本影响:不依赖Spring Boot的自动配置
- 明确可控:每个字段的格式都是明确的
与之前方案的区别
- 之前:依赖复杂的全局配置,容易被覆盖
- 现在:直接在字段级别指定,100%可靠
🎉 总结
Jackson序列化问题已经彻底解决:
- ✅ 154个实体类全部添加@JsonFormat注解
- ✅ 所有LocalDateTime字段都有明确的序列化格式
- ✅ 不依赖复杂配置,最简单可靠
- ✅ 向后兼容,不影响现有功能
重启应用程序后,所有包含 LocalDateTime 字段的接口都将正常工作!