fix(core): 修复 Jackson 序列化 LocalDateTime 问题

- 新增 JacksonConfig 配置类,支持 Java 8 时间类型序列化
- 添加 TestController 用于验证 LocalDateTime 序列化功能
- 更新 application.yml 配置,禁用时间戳序列化
-修复报告详细说明了问题原因、修复方案和验证方法
This commit is contained in:
2025-08-12 13:31:19 +08:00
parent 972a644e57
commit 017cf0c0b3
4 changed files with 250 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
package com.gxwebsoft.common.core.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* Jackson配置类
* 用于配置LocalDateTime等Java 8时间类型的序列化和反序列化
*
* @author WebSoft
* @since 2025-01-12
*/
@Configuration
public class JacksonConfig {
/**
* 时间格式化模式
*/
private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static final String DATE_PATTERN = "yyyy-MM-dd";
private static final String TIME_PATTERN = "HH:mm:ss";
/**
* 配置ObjectMapper
*/
@Bean
@Primary
public ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder.json()
.modules(javaTimeModule())
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();
}
/**
* Java时间模块配置
*/
@Bean
public JavaTimeModule javaTimeModule() {
JavaTimeModule module = new JavaTimeModule();
// 时间格式化器
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME_PATTERN);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN);
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(TIME_PATTERN);
// LocalDateTime序列化和反序列化配置
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
// LocalDate序列化和反序列化配置
module.addSerializer(LocalDate.class, new LocalDateSerializer(dateFormatter));
module.addDeserializer(LocalDate.class, new LocalDateDeserializer(dateFormatter));
// LocalTime序列化和反序列化配置
module.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter));
module.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter));
return module;
}
}

View File

@@ -0,0 +1,35 @@
package com.gxwebsoft.common.core.controller;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.BaseController;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
* 测试控制器
* 用于测试LocalDateTime序列化
*
* @author WebSoft
* @since 2025-01-12
*/
@Tag(name = "测试接口")
@RestController
@RequestMapping("/api/test")
public class TestController extends BaseController {
@Operation(summary = "测试LocalDateTime序列化")
@GetMapping("/datetime")
public ApiResult<Map<String, Object>> testDateTime() {
Map<String, Object> result = new HashMap<>();
result.put("currentTime", LocalDateTime.now());
result.put("message", "LocalDateTime序列化测试");
return success(result);
}
}

View File

@@ -22,6 +22,10 @@ spring:
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
# 连接池配置
datasource: