|
|
@@ -1,11 +1,11 @@
|
|
|
package com.haha.admin.config;
|
|
|
|
|
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
|
|
+import com.fasterxml.jackson.databind.JsonDeserializer;
|
|
|
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;
|
|
|
@@ -14,6 +14,7 @@ import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
import org.springframework.context.annotation.Primary;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
|
@@ -22,30 +23,31 @@ import java.time.format.DateTimeFormatter;
|
|
|
@Configuration
|
|
|
public class JacksonConfig {
|
|
|
|
|
|
- private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
|
|
- private static final String DATE_FORMAT = "yyyy-MM-dd";
|
|
|
- private static final String TIME_FORMAT = "HH:mm:ss";
|
|
|
+ private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ private static final DateTimeFormatter DATE_TIME_LENIENT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm[:ss]");
|
|
|
+ private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
|
|
|
|
|
|
@Bean
|
|
|
@Primary
|
|
|
public ObjectMapper objectMapper() {
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
-
|
|
|
+
|
|
|
JavaTimeModule javaTimeModule = new JavaTimeModule();
|
|
|
- javaTimeModule.addSerializer(LocalDateTime.class,
|
|
|
- new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
|
|
|
- javaTimeModule.addDeserializer(LocalDateTime.class,
|
|
|
- new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
|
|
|
-
|
|
|
- javaTimeModule.addSerializer(LocalDate.class,
|
|
|
- new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
|
|
|
- javaTimeModule.addDeserializer(LocalDate.class,
|
|
|
- new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
|
|
|
-
|
|
|
- javaTimeModule.addSerializer(LocalTime.class,
|
|
|
- new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
|
|
|
- javaTimeModule.addDeserializer(LocalTime.class,
|
|
|
- new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
|
|
|
+ javaTimeModule.addSerializer(LocalDateTime.class,
|
|
|
+ new LocalDateTimeSerializer(DATE_TIME_FORMATTER));
|
|
|
+ javaTimeModule.addDeserializer(LocalDateTime.class,
|
|
|
+ new LenientLocalDateTimeDeserializer());
|
|
|
+
|
|
|
+ javaTimeModule.addSerializer(LocalDate.class,
|
|
|
+ new LocalDateSerializer(DATE_FORMATTER));
|
|
|
+ javaTimeModule.addDeserializer(LocalDate.class,
|
|
|
+ new LocalDateDeserializer(DATE_FORMATTER));
|
|
|
+
|
|
|
+ javaTimeModule.addSerializer(LocalTime.class,
|
|
|
+ new LocalTimeSerializer(TIME_FORMATTER));
|
|
|
+ javaTimeModule.addDeserializer(LocalTime.class,
|
|
|
+ new LocalTimeDeserializer(TIME_FORMATTER));
|
|
|
|
|
|
mapper.registerModule(javaTimeModule);
|
|
|
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
|
|
@@ -53,4 +55,27 @@ public class JacksonConfig {
|
|
|
|
|
|
return mapper;
|
|
|
}
|
|
|
+
|
|
|
+ public static class LenientLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
|
|
|
+ @Override
|
|
|
+ public LocalDateTime deserialize(com.fasterxml.jackson.core.JsonParser p,
|
|
|
+ com.fasterxml.jackson.databind.DeserializationContext ctxt) throws IOException {
|
|
|
+ String text = p.getValueAsString();
|
|
|
+ if (text == null || text.isBlank()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ text = text.trim();
|
|
|
+ try {
|
|
|
+ return LocalDateTime.parse(text, DATE_TIME_FORMATTER);
|
|
|
+ } catch (Exception e) {
|
|
|
+ try {
|
|
|
+ String padded = text.length() == 16 ? text + ":00" : text;
|
|
|
+ return LocalDateTime.parse(padded, DATE_TIME_FORMATTER);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ throw new IOException(
|
|
|
+ "无法解析日期时间: " + text + ", 支持格式: yyyy-MM-dd HH:mm:ss", ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|