135 lines
4.0 KiB
Markdown
135 lines
4.0 KiB
Markdown
# 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字段的接口都应该能正常工作。
|