fix(core): 修复 Jackson 序列化 LocalDateTime 问题
- 新增 JacksonConfig 配置类,支持 Java 8 时间类型序列化 - 添加 TestController 用于验证 LocalDateTime 序列化功能 - 更新 application.yml 配置,禁用时间戳序列化 -修复报告详细说明了问题原因、修复方案和验证方法
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user