小程序开发-服务端
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

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注解最有效?

  1. 直接作用:直接在字段上指定序列化格式
  2. 优先级最高:覆盖所有全局配置
  3. 不受版本影响:不依赖Spring Boot的自动配置
  4. 明确可控:每个字段的格式都是明确的

与之前方案的区别

  • 之前:依赖复杂的全局配置,容易被覆盖
  • 现在:直接在字段级别指定,100%可靠

🎉 总结

Jackson序列化问题已经彻底解决

  • 154个实体类全部添加@JsonFormat注解
  • 所有LocalDateTime字段都有明确的序列化格式
  • 不依赖复杂配置,最简单可靠
  • 向后兼容,不影响现有功能

重启应用程序后,所有包含 LocalDateTime 字段的接口都将正常工作!