- 移动文档到docs目录下
This commit is contained in:
123
docs/Jackson问题最终修复方案.md
Normal file
123
docs/Jackson问题最终修复方案.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# 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 序列化正常工作,即使某一层配置失效,其他层也能提供保障。重启应用程序后应该能完全解决序列化问题。
|
||||
Reference in New Issue
Block a user