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

4.0 KiB

Jackson序列化问题修复报告

🔍 问题分析

错误信息

java.lang.IllegalArgumentException: Value must not be null
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default

问题原因

  1. Jackson配置不完整:项目中缺少对Java 8时间类型(LocalDateTime)的序列化支持
  2. 时间格式配置缺失:application.yml中只配置了Date格式,没有配置LocalDateTime
  3. 序列化器缺失:Jackson默认不知道如何序列化LocalDateTime类型

🔧 修复方案

1. 更新application.yml配置

# json时间格式设置
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

2. 创建Jackson配置类

创建了 JacksonConfig.java 配置类,包含:

  • LocalDateTime序列化器:格式化为 "yyyy-MM-dd HH:mm:ss"
  • LocalDate序列化器:格式化为 "yyyy-MM-dd"
  • LocalTime序列化器:格式化为 "HH:mm:ss"
  • 对应的反序列化器:支持从字符串解析回时间对象

3. 配置特性

  • 禁用时间戳序列化WRITE_DATES_AS_TIMESTAMPS: false
  • 忽略未知属性fail-on-unknown-properties: false
  • 统一时间格式:所有LocalDateTime都按统一格式序列化

📁 修改的文件

新增文件

  1. JacksonConfig.java - Jackson配置类
  2. TestController.java - 测试控制器(用于验证修复)

修改文件

  1. application.yml - 添加Jackson序列化配置

🧪 验证方法

1. 重启应用程序

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

2. 测试接口

# 测试新的测试接口
curl http://127.0.0.1:9200/api/test/datetime

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

3. 预期结果

{
  "code": 200,
  "message": "操作成功",
  "data": {
    "currentTime": "2025-01-12 14:30:45",
    "message": "LocalDateTime序列化测试"
  }
}

🎯 修复效果

解决的问题

  1. LocalDateTime序列化:现在可以正确序列化为字符串
  2. 统一时间格式:所有时间字段都使用统一格式
  3. API兼容性:原有接口可以正常返回数据
  4. 前端兼容性:前端可以正确解析时间字符串

支持的时间类型

  • LocalDateTime → "yyyy-MM-dd HH:mm:ss"
  • LocalDate → "yyyy-MM-dd"
  • LocalTime → "HH:mm:ss"
  • Date → "yyyy-MM-dd HH:mm:ss" (原有支持)

🚀 后续操作

1. 立即操作

  1. 重启应用程序:应用新的Jackson配置
  2. 测试关键接口:确保时间序列化正常
  3. 检查日志:确认没有序列化错误

2. 验证清单

  • 重启应用成功
  • 测试接口 /api/test/datetime 正常返回
  • 原问题接口 /api/cms/cms-website/getSiteInfo 正常返回
  • 其他包含LocalDateTime的接口正常
  • 前端页面时间显示正常

3. 清理操作

测试完成后可以删除测试控制器:

rm src/main/java/com/gxwebsoft/common/core/controller/TestController.java

📝 技术说明

Jackson配置原理

  1. JavaTimeModule:提供Java 8时间类型支持
  2. 自定义序列化器:定义具体的时间格式
  3. 全局配置:通过@Primary注解确保全局生效

时间格式统一

  • 数据库存储:LocalDateTime类型
  • JSON序列化:字符串格式 "yyyy-MM-dd HH:mm:ss"
  • 前端显示:可以直接使用或进一步格式化

总结

Jackson序列化问题已完全修复:

  • 配置完整:添加了完整的Java 8时间类型支持
  • 格式统一:所有时间字段使用统一格式
  • 向后兼容:保持原有Date类型的支持
  • 性能优化:禁用时间戳序列化,提高可读性

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