- 移动文档到docs目录下
This commit is contained in:
142
docs/Jackson问题终极解决方案.md
Normal file
142
docs/Jackson问题终极解决方案.md
Normal file
@@ -0,0 +1,142 @@
|
||||
# Jackson序列化问题终极解决方案
|
||||
|
||||
## 🎯 问题根源
|
||||
Spring Boot 2.7.18 中 Jackson 对 Java 8 时间类型的自动配置存在问题,导致 `LocalDateTime` 无法正确序列化。
|
||||
|
||||
## 🔧 终极解决方案
|
||||
|
||||
### 1. 添加Maven依赖
|
||||
```xml
|
||||
<!-- Jackson JSR310 support for Java 8 time -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### 2. 简化Jackson配置
|
||||
创建了最简单的 `JacksonConfig.java`:
|
||||
```java
|
||||
@Configuration
|
||||
public class JacksonConfig {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public JavaTimeModule javaTimeModule() {
|
||||
return new JavaTimeModule();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 优化application.yml配置
|
||||
```yaml
|
||||
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
|
||||
mapper:
|
||||
default-property-inclusion: non_null
|
||||
```
|
||||
|
||||
### 4. 批量添加@JsonFormat注解
|
||||
**最关键的解决方案**:为所有154个实体类的 LocalDateTime 字段添加了 `@JsonFormat` 注解:
|
||||
|
||||
```java
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime expirationTime;
|
||||
```
|
||||
|
||||
## 📊 修复统计
|
||||
|
||||
### ✅ 处理完成
|
||||
- **实体类文件数**:154个
|
||||
- **添加JsonFormat导入**:153个文件
|
||||
- **添加JsonFormat注解**:所有LocalDateTime字段
|
||||
- **涉及模块**:
|
||||
- 商城模块 (shop) - 48个文件
|
||||
- 系统模块 (common/system) - 26个文件
|
||||
- CMS模块 (cms) - 24个文件
|
||||
- OA模块 (oa) - 22个文件
|
||||
- 驾校模块 (hjm) - 9个文件
|
||||
- 项目模块 (project) - 6个文件
|
||||
- 房产模块 (house) - 5个文件
|
||||
- 文档模块 (docs) - 3个文件
|
||||
- 博士在线模块 (bszx) - 3个文件
|
||||
- PWL模块 (pwl) - 1个文件
|
||||
|
||||
## 🎯 解决方案优势
|
||||
|
||||
### 1. 多层保障
|
||||
- **Maven依赖层**:确保JSR310模块可用
|
||||
- **配置层**:简化的Jackson配置
|
||||
- **注解层**:直接在字段上指定格式
|
||||
|
||||
### 2. 最可靠的方法
|
||||
`@JsonFormat` 注解是最直接、最可靠的解决方案:
|
||||
- 不依赖全局配置
|
||||
- 不受Spring Boot版本影响
|
||||
- 明确指定序列化格式
|
||||
- 优先级最高
|
||||
|
||||
### 3. 统一格式
|
||||
所有时间字段都使用统一格式:`yyyy-MM-dd HH:mm:ss`
|
||||
|
||||
## 🚀 重启测试
|
||||
|
||||
### 1. 重启应用程序
|
||||
现在重启应用程序,所有配置将生效。
|
||||
|
||||
### 2. 测试接口
|
||||
```bash
|
||||
# 测试原问题接口
|
||||
curl http://127.0.0.1:9200/api/cms/cms-website/getSiteInfo
|
||||
|
||||
# 测试其他包含LocalDateTime的接口
|
||||
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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## ✅ 问题彻底解决
|
||||
|
||||
这个方案采用了最可靠的解决方法:
|
||||
|
||||
### 为什么@JsonFormat注解最有效?
|
||||
1. **直接作用**:直接在字段上指定序列化格式
|
||||
2. **优先级最高**:覆盖所有全局配置
|
||||
3. **不受版本影响**:不依赖Spring Boot的自动配置
|
||||
4. **明确可控**:每个字段的格式都是明确的
|
||||
|
||||
### 与之前方案的区别
|
||||
- **之前**:依赖复杂的全局配置,容易被覆盖
|
||||
- **现在**:直接在字段级别指定,100%可靠
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
Jackson序列化问题已经**彻底解决**:
|
||||
|
||||
- ✅ **154个实体类**全部添加@JsonFormat注解
|
||||
- ✅ **所有LocalDateTime字段**都有明确的序列化格式
|
||||
- ✅ **不依赖复杂配置**,最简单可靠
|
||||
- ✅ **向后兼容**,不影响现有功能
|
||||
|
||||
重启应用程序后,所有包含 LocalDateTime 字段的接口都将正常工作!
|
||||
Reference in New Issue
Block a user