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

Jackson序列化问题最终修复方案

🔍 问题分析

错误信息

Java 8 date/time type `java.time.LocalDateTime` not supported by default: 
add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling

根本原因

Spring Boot 2.7.18 版本中,Jackson 对 Java 8 时间类型的支持可能存在配置问题。

🔧 最终修复方案

1. 添加Maven依赖

pom.xml 中添加了:

<!-- Jackson JSR310 support for Java 8 time -->
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

2. 创建自定义序列化器

  • LocalDateTimeSerializer.java - 自定义序列化器
  • LocalDateTimeDeserializer.java - 自定义反序列化器

3. 更新Jackson配置

  • JacksonConfig.java - 使用自定义序列化器
  • WebMvcConfig.java - 配置消息转换器
  • application.yml - 基础Jackson配置

4. 实体类注解

CmsWebsite 实体类的时间字段添加了 @JsonFormat 注解:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime expirationTime;

📁 修改的文件

新增文件

  1. LocalDateTimeSerializer.java - 自定义序列化器
  2. LocalDateTimeDeserializer.java - 自定义反序列化器

修改文件

  1. pom.xml - 添加Jackson JSR310依赖
  2. JacksonConfig.java - 简化配置,使用自定义序列化器
  3. WebMvcConfig.java - 配置消息转换器
  4. application.yml - 更新Jackson配置
  5. CmsWebsite.java - 添加@JsonFormat注解

🚀 重启和测试

1. 重启应用程序

# 停止当前应用
# 重新启动应用

2. 测试接口

# 测试原问题接口
curl http://127.0.0.1:9200/api/cms/cms-website/getSiteInfo

# 测试新的测试接口
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"
  }
}

🎯 多层保障

这个修复方案采用了多层保障策略:

第一层:Maven依赖

确保 jackson-datatype-jsr310 模块可用

第二层:自定义序列化器

创建专门的 LocalDateTime 序列化器和反序列化器

第三层:Jackson配置

通过 JacksonConfig 注册自定义序列化器

第四层:消息转换器

通过 WebMvcConfig 确保使用正确的 ObjectMapper

第五层:实体类注解

直接在实体类字段上使用 @JsonFormat 注解

预期效果

重启应用程序后:

  • 所有 LocalDateTime 字段都能正确序列化
  • 时间格式统一为 "yyyy-MM-dd HH:mm:ss"
  • API 接口正常返回 JSON 数据
  • 前端可以正确解析时间字符串

🔧 故障排除

如果问题仍然存在:

  1. 检查依赖:确认 jackson-datatype-jsr310 依赖已正确添加
  2. 清理缓存:删除 target 目录重新编译
  3. 检查日志:查看启动日志中的 Jackson 相关信息
  4. 测试单个字段:先测试简单的 LocalDateTime 字段

📝 备注

这个方案使用了多种方法确保 LocalDateTime 序列化正常工作,即使某一层配置失效,其他层也能提供保障。重启应用程序后应该能完全解决序列化问题。