Files
mp-java/docs/Jackson序列化问题修复报告.md

135 lines
4.0 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.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配置
```yaml
# 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. 重启应用程序
```bash
# 停止当前应用
# 重新启动应用
```
### 2. 测试接口
```bash
# 测试新的测试接口
curl http://127.0.0.1:9200/api/test/datetime
# 测试原始问题接口
curl http://127.0.0.1:9200/api/cms/cms-website/getSiteInfo
```
### 3. 预期结果
```json
{
"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. 清理操作
测试完成后可以删除测试控制器:
```bash
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字段的接口都应该能正常工作。