Spring Boot中LocalDateTime反序列化InvalidFormatException问题排查
解决Spring Boot中LocalDateTime反序列化异常问题
1. 修复InvalidFormatException的具体方案
方案一:将字段类型改为LocalDate(推荐)
核心问题是前端传递的是纯日期字符串(如"10/01/2024"),但后端用的是包含日期+时间的LocalDateTime类型,@JsonFormat(pattern = "dd/MM/yyyy")只能解析日期部分,无法自动补全时间信息,导致解析失败。
如果业务场景不需要时间部分,直接修改字段类型即可:
// 修改Lancamento类的字段定义 @JsonFormat(pattern = "dd/MM/yyyy") private LocalDate data;
方案二:保留LocalDateTime类型,自定义解析逻辑
如果必须使用LocalDateTime,需要让Jackson在解析纯日期字符串时自动补全时分秒为00:00:00,有两种实现方式:
方式1:字段级自定义反序列化器
编写自定义反序列化器处理纯日期字符串:
public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer { public CustomLocalDateTimeDeserializer() { super(DateTimeFormatter.ofPattern("dd/MM/yyyy")); } @Override public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { String dateStr = parser.getText().trim(); // 处理纯日期格式,自动补全时分秒 if (dateStr.length() == 10) { return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("dd/MM/yyyy")).atStartOfDay(); } return super.deserialize(parser, context); } }
然后在字段上标注使用该反序列化器:
@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonFormat(pattern = "dd/MM/yyyy") private LocalDateTime data;
方式2:全局配置Jackson(适用于多字段统一处理场景)
在Spring Boot中添加全局Jackson配置类,统一处理LocalDateTime的解析:
@Configuration public class JacksonDateTimeConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonDateTimeCustomizer() { return builder -> { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); // 自定义反序列化器,补全纯日期的时间部分 LocalDateTimeDeserializer deserializer = new LocalDateTimeDeserializer(dateFormatter) { @Override public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { String dateStr = parser.getText().trim(); if (dateStr.length() == 10) { return LocalDate.parse(dateStr, dateFormatter).atStartOfDay(); } return super.deserialize(parser, context); } }; // 全局注册序列化/反序列化器 builder.deserializerByType(LocalDateTime.class, deserializer); builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(dateFormatter)); }; } }
2. LocalDateTime序列化与反序列化的必要配置
是的,LocalDateTime(属于JSR310日期时间API)的序列化/反序列化需要特定配置:
- Jackson默认不支持JSR310类型,需依赖
jackson-datatype-jsr310组件(Spring Boot的spring-boot-starter-web已默认包含该依赖)。 - Jackson默认使用ISO-8601格式(如
2024-01-10T00:00:00)处理LocalDateTime,如果要使用自定义格式(如dd/MM/yyyy),必须通过以下方式配置:- 字段级:使用
@JsonFormat指定pattern和timezone(可选),但需注意类型匹配(纯日期字符串对应LocalDate,带时间的字符串对应LocalDateTime)。 - 全局级:通过
Jackson2ObjectMapperBuilderCustomizer统一配置序列化/反序列化规则,避免重复编写注解。
- 字段级:使用
内容的提问来源于stack exchange,提问作者Daniel Lincoln Silva
相关产品推荐
相关产品推荐

