Java 8 的 LocalDateTime 等类型需引入 jackson-datatype-jsr310 模块并配置 JavaTimeModule 及自定义 DateTimeFormatter 才能被 Jackson 正确序列化/反序列化,Spring Boot 2.0+ 默认已集成该模块。

Java 8 的 LocalDateTime、LocalDate、LocalTime 默认不能被 Jackson 直接序列化或反序列化,因为 Jackson 核心库诞生于 Java 8 之前,不原生支持 java.time 包。必须显式引入支持模块并配置格式规则,否则会报错:Java8 date/time type java.time.LocalDateTime not supported by default。
添加 JSR-310 支持模块
这是前提条件,没有它,任何格式配置都无效。
- Spring Boot 2.0+ 项目默认已自动引入
jackson-datatype-jsr310,无需手动加依赖 - 非 Spring Boot 或老版本项目,需在
pom.xml中显式添加:
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
统一全局配置日期格式
避免在每个字段上重复加注解,推荐在配置类中定制 ObjectMapper:
- 注册
JavaTimeModule模块 - 为
LocalDateTime指定序列化器(转 JSON 字符串)和反序列化器(从 JSON 字符串还原) - 使用自定义
DateTimeFormatter统一格式,例如"yyyy-MM-dd HH:mm:ss"
示例配置:
立即学习“Java免费学习笔记(深入)”;
@Bean@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
JavaTimeModule module = new JavaTimeModule();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
mapper.registerModule(module);
return mapper;
}
按字段灵活控制格式(适合局部差异)
当某些字段需要不同格式(如只传日期、或带毫秒),可用注解精准控制:
-
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"):控制@ResponseBody返回时的序列化格式 -
@DateTimeFormat(pattern = "yyyy-MM-dd"):控制@RequestParam或@ModelAttribute接收表单/Query 参数时的解析格式 - 两者可共存于同一字段,分别作用于出参和入参
例如:
private Long id;private String name;
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birthday;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
private LocalDateTime createTime;
处理时间戳(Epoch Millis)场景
若前端传的是毫秒值(如 1722215471000),而非字符串,Jackson 默认无法直接转 LocalDateTime,因为缺少时区信息。
- 推荐先转为
Instant,再结合系统默认时区转成LocalDateTime - 可自定义
JsonDeserializer<LocalDateTime>,内部调用Instant.ofEpochMilli(value).atZone(ZoneId.systemDefault()).toLocalDateTime() - 或改用
@JsonCreator配合构造函数接收 long 参数,手动转换


















