Переглянути джерело

localdate类型做统一反序列化处理。支持传入空值、iso日期字符串、yyyy-MM-dd格式的字符串

jxl 13 годин тому
батько
коміт
0d6e969f41

+ 26 - 3
leromro-framework/src/main/java/com/leromro/framework/config/ApplicationConfig.java

@@ -1,9 +1,12 @@
 package com.leromro.framework.config;
 
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.deser.std.DateDeserializers;
 import com.fasterxml.jackson.databind.ser.std.DateSerializer;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-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;
@@ -15,6 +18,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.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -48,9 +52,28 @@ public class ApplicationConfig
                 .serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                 .serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
                 .serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")))
-//                .deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                 .deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
                 .deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")))
-                .deserializerByType(Date.class, new DateDeserializers.DateDeserializer(DateDeserializers.DateDeserializer.instance, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss"));
+                .deserializerByType(Date.class, new DateDeserializers.DateDeserializer(DateDeserializers.DateDeserializer.instance, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss"))
+                .deserializerByType(LocalDate.class, new JsonDeserializer() {
+                    private final DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE_TIME;
+                    private final DateTimeFormatter dateOnlyFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+                    @Override
+                    public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+                        String value = p.getValueAsString();
+                        try {
+                            if(StrUtil.isBlank(value)){
+                                return null;
+                            }
+                            // 尝试解析 ISO 格式(带时间部分)
+                            return LocalDateTime.parse(value, isoFormatter).toLocalDate();
+                        } catch (Exception e) {
+                            // 如果失败,尝试解析纯日期格式
+                            return LocalDate.parse(value, dateOnlyFormatter);
+                        }
+                    }
+                });
+
     }
 }