# 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` 中添加了: ```xml com.fasterxml.jackson.datatype jackson-datatype-jsr310 ``` ### 2. 创建自定义序列化器 - **LocalDateTimeSerializer.java** - 自定义序列化器 - **LocalDateTimeDeserializer.java** - 自定义反序列化器 ### 3. 更新Jackson配置 - **JacksonConfig.java** - 使用自定义序列化器 - **WebMvcConfig.java** - 配置消息转换器 - **application.yml** - 基础Jackson配置 ### 4. 实体类注解 为 `CmsWebsite` 实体类的时间字段添加了 `@JsonFormat` 注解: ```java @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. 重启应用程序 ```bash # 停止当前应用 # 重新启动应用 ``` ### 2. 测试接口 ```bash # 测试原问题接口 curl http://127.0.0.1:9200/api/cms/cms-website/getSiteInfo # 测试新的测试接口 curl http://127.0.0.1:9200/api/test/datetime ``` ### 3. 预期结果 ```json { "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 序列化正常工作,即使某一层配置失效,其他层也能提供保障。重启应用程序后应该能完全解决序列化问题。