diff --git a/openhis-server-new/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java b/openhis-server-new/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java index a36d518ad..df5edb701 100755 --- a/openhis-server-new/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java +++ b/openhis-server-new/core-framework/src/main/java/com/core/framework/config/ApplicationConfig.java @@ -1,7 +1,9 @@ package com.core.framework.config; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; @@ -9,6 +11,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; +import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.TimeZone; @@ -24,6 +27,36 @@ import java.util.TimeZone; // 指定要扫描的Mapper类的包的路径 @MapperScan({"com.core.**.mapper", "com.openhis.**.mapper"}) public class ApplicationConfig { + + /** 支持多种日期格式的反序列化器 */ + private static final JsonDeserializer LOCAL_DATE_TIME_DESERIALIZER = new JsonDeserializer() { + private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + private static final DateTimeFormatter SIMPLE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter SLASH_FORMATTER = DateTimeFormatter.ofPattern("yyyy/M/d HH:mm:ss"); + + @Override + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + String text = p.getText(); + if (text == null || text.isEmpty()) { + return null; + } + // 去除时区后缀 Z/z 和偏移量 +HH:MM/+HHMM(LocalDateTime 不含时区信息) + String cleaned = text.replaceAll("[Zz]$", "").replaceAll("[+-]\\d{2}:?\\d{2}$", ""); + // 尝试 ISO 8601 格式(yyyy-MM-ddTHH:mm:ss.SSS) + try { + return LocalDateTime.parse(cleaned, ISO_FORMATTER); + } catch (Exception ignored) { + } + // 尝试简单格式(yyyy-MM-dd HH:mm:ss) + try { + return LocalDateTime.parse(cleaned, SIMPLE_FORMATTER); + } catch (Exception ignored) { + } + // 尝试斜杠格式(yyyy/M/d HH:mm:ss) + return LocalDateTime.parse(cleaned, SLASH_FORMATTER); + } + }; + /** * 时区配置 */ @@ -36,7 +69,7 @@ public class ApplicationConfig { builder.simpleDateFormat("yyyy/M/d HH:mm:ss"); // 添加JavaTimeModule支持,用于LocalDateTime JavaTimeModule javaTimeModule = new JavaTimeModule(); - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + javaTimeModule.addDeserializer(LocalDateTime.class, LOCAL_DATE_TIME_DESERIALIZER); builder.modules(javaTimeModule); builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy/M/d HH:mm:ss"))); };