Jackson反序列化LocalDateTime时InvalidDefinitionException报错的解决方法
解决Jackson反序列化LocalDateTime的错误
核心原因
错误本质是Jackson无法直接将字符串格式日期转换为LocalDateTime对象,即便添加了序列化/反序列化注解,仍存在两个常见问题:
- 缺少Java 8时间API的Jackson支持模块
- 未明确指定与JSON日期字符串匹配的格式
具体解决步骤
1. 引入jackson-datatype-jsr310依赖
这是Jackson支持Java 8时间API的核心模块,必须确保项目已引入:
- Maven项目(pom.xml):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>与项目jackson版本一致</version> </dependency>
- Gradle项目:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:与项目jackson版本一致'
2. 指定日期匹配格式
有两种可选方式:
方式一:字段级注解配置
修改实体类字段,添加@JsonFormat指定格式:
@JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSSSSS", timezone = "GMT+8") public LocalDateTime date;
pattern需严格匹配JSON中的日期格式(示例对应2023-09-22 01:07:50.062477),timezone根据业务时区调整。
方式二:全局ObjectMapper配置
如果多个字段需要处理,推荐全局配置避免重复注解:
@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); JavaTimeModule module = new JavaTimeModule(); // 配置反序列化格式 module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"))); // 配置序列化格式 module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"))); mapper.registerModule(module); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; }
配置后实体类字段可简化为:
public LocalDateTime date;
3. 检查实体类构造器
若实体类没有无参构造器,Jackson无法实例化对象,需补充:
public YourEntityClass() { // 无参构造器 }
验证
完成配置后重新运行程序,Jackson即可正确将JSON日期字符串反序列化为LocalDateTime对象。
内容的提问来源于stack exchange,提问作者Paulo Roberto
相关产品推荐
相关产品推荐

