Spring Boot中LocalDate序列化失效 @JsonFormat注解不生效问题
Spring Boot RestController LocalDate日期反序列化失败解决方案
核心问题原因
你当前代码报错的核心原因是:显式指定了无参的LocalDateDeserializer反序列化器,该序列化器默认使用yyyy-MM-dd格式解析日期,会忽略你字段上标注的@JsonFormat自定义格式规则。你传入的日期字符串08-06-1993以日期开头,不符合默认年开头的解析规则,所以直接在索引0位置抛出解析异常。
可用解决方案
方案1:删除冗余的序列化/反序列化器注解(最推荐)
只保留@JsonFormat注解即可,只要项目引入了JSR310时间处理模块,Jackson会自动识别注解上的格式完成解析,修改后实体类字段代码如下:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") private LocalDate dob;
如果是较低版本的Spring Boot项目缺失JSR310依赖,在pom.xml中添加以下依赖即可(Spring Boot 2.x+版本默认已经集成,无需手动添加):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
方案2:自定义指定格式的反序列化器
如果你需要显式指定反序列化器,需要自定义实现对应格式的反序列化类:
public class CustomLocalDateDeserializer extends LocalDateDeserializer { public CustomLocalDateDeserializer() { super(DateTimeFormatter.ofPattern("dd-MM-yyyy")); } }
然后在字段上替换原有的反序列化器配置:
@JsonDeserialize(using = CustomLocalDateDeserializer.class) @JsonSerialize(using = LocalDateSerializer.class) @JsonFormat(shape=JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") private LocalDate dob;
方案3:全局配置日期解析规则
如果全项目都是统一的dd-MM-yyyy日期格式,可以直接配置全局规则,无需每个字段加注解:
@Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> builder .serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("dd-MM-yyyy"))) .deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("dd-MM-yyyy"))); } }
内容的提问来源于stack exchange,提问作者dileep
相关产品推荐
相关产品推荐

