jackson 默认不支持 localdatetime 反序列化,需注册 javatimemodule 模块并引入 jackson-datatype-jsr310 依赖;推荐全局配置 objectmapper 并注册该模块,或对字段使用 @jsonformat 注解指定格式。

Jackson 默认不直接支持 LocalDateTime 的反序列化,必须显式注册 JavaTimeModule 模块,否则会抛出类似 Cannot deserialize instance of java.time.LocalDateTime 的异常。关键在于让 ObjectMapper 认识 JSR-310 时间类型,并指定其解析逻辑。
需要引入依赖
<dependency><groupid>com.fasterxml.jackson.datatype</groupid><artifactid>jackson-datatype-jsr310</artifactid><version>2.15.3</version><!-- 建议用 Spring Boot 对应版本 --></dependency>
Spring Boot 2.2+ 通常已自动引入该依赖,但若手动管理依赖或使用较老版本,需确认存在。
全局配置 JavaTimeModule(推荐)
在 Spring Boot 中,通过 @Bean 注册自定义 ObjectMapper,并注册 JavaTimeModule:
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
// 自定义 LocalDateTime 格式(可选,默认支持 ISO 格式)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
javaTimeModule.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(formatter));
javaTimeModule.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(formatter));
mapper.registerModule(javaTimeModule);
// 其他常用配置
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
return mapper;
}
该配置生效后,所有 Controller 入参、Feign 调用、@RequestBody 解析都会按指定格式处理 LocalDateTime。
局部控制:用 @JsonFormat 注解
适用于单个字段或类,无需改全局配置:
public class Order {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", shape = JsonFormat.Shape.STRING)
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING)
private LocalDate orderDate;
}
注意:
-
shape = JsonFormat.Shape.STRING必须显式声明,否则 Jackson 可能尝试按数字或数组解析; - pattern 必须与传入 JSON 字符串完全匹配(如
"2026-07-14 01:35:00"),否则抛DateTimeParseException; - 不支持多格式兼容(比如同时接受
"yyyy-MM-dd HH:mm:ss"和"yyyy/MM/dd HH:mm:ss"),需自定义反序列化器。
常见反序列化失败原因及修复
-
传入格式不匹配:JSON 中是
"2026-07-14 01:35:00",但未配置对应LocalDateTimeDeserializer或@JsonFormat,Jackson 默认只认 ISO 格式(如"2026-07-14T01:35:00"); -
缺少 jackson-datatype-jsr310 依赖:此时
JavaTimeModule无法加载,LocalDateTime类型会被跳过或报错; -
ObjectMapper 实例未被 Spring 管理:比如手动
new ObjectMapper(),未注册模块,导致配置失效; -
多个 ObjectMapper Bean 冲突:确保
@Primary标记或通过Jackson2ObjectMapperBuilderCustomizer统一注入。
验证是否生效的小技巧
写个简单测试:
@Test
void testLocalDateTimeDeserialization() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
String json = "{\"createTime\":\"2026-07-14 01:35:00\"}";
Order order = mapper.readValue(json, Order.class);
assertNotNull(order.getCreateTime()); // 若成功,说明配置有效
}
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











