一 背景介绍:页面表单传参,消费者也是表单,生产者json接参
二 失败案例
1.DTO属性上加@JsonSerialize(using = LocalDateTimeSerializer.class)
消费者页面报错: Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDateTime' for property 'grantEndTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@com.fasterxml.jackson.databind.annotation.JsonSerialize @javax.validation.constraints.NotNull java.time.LocalDateTime] for value '2024-03-16 00:00:00'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2024-03-16 00:00:00]
2.DTO属性上加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"),问题同1
3.DTO属性上加 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
生产者报错:org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String "2024-03-25 00:00:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2024-03-25 00:00:00' could not be parsed at index 10; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "2024-03-25 00:00:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2024-03-25 00:00:00' could not be parsed at index 10
4.消费者DTO属性上加 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
生产者DTO属性上加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"),
(ps:只在生产者DTO属性上加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")也不行,会Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDateTime' for property 'grantEndTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull java.time.LocalDateTime] for value '2024-03-08 00:00:00'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2024-03-08 00:00:00])
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.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; @Configuration public class LocalDateTimeConfiguration { private static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd"; private static final String DEFAULT_TIME_PATTERN = "HH:mm:ss"; private static final DateTimeFormatter DATE_PATTERN = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd[ ]['T'][HH:mm:ss][.SSSSSS][.SSSSS][.SSSS][.SSS][.SS][.S][X]") .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) .parseDefaulting(ChronoField.MILLI_OF_SECOND, 0) .parseDefaulting(ChronoField.NANO_OF_SECOND, 0) .toFormatter() .withZone(ZoneOffset.UTC); // assume incoming is UTC @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){ return builder -> { builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN))); builder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); builder.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); //日期反序列化 builder.deserializerByType(LocalDateTime.class,new LocalDateTimeDeserializer(DATE_PATTERN)); builder.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); builder.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); }; } }
不报错
原因分析:消费者将2024-03-08 00:00:00转为1710172800000格式,生产者将1710172800000转为LocalDateTime格式