Files
mp-java/docs/Jackson问题最终修复方案.md

124 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
<!-- 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` 注解:
```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 序列化正常工作,即使某一层配置失效,其他层也能提供保障。重启应用程序后应该能完全解决序列化问题。