Jackson日期时间配置说明
问题描述
在使用Java 8的LocalDateTime、LocalDate、LocalTime等时间类型时,Jackson默认不支持序列化和反序列化,会抛出以下异常:
InvalidDefinitionException: Java 8 date/time type `java.time解决方案
已创建JacksonConfig配置类来解决此问题。
配置文件位置
JacksonConfig.java
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @Configuration public class JacksonConfig { /** * 日期时间格式 */ private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DATE_PATTERN = "yyyy-MM-dd"; private static final String TIME_PATTERN = "HH:mm:ss"; @Bean @Primary public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 注册JavaTimeModule,支持Java 8时间类型 JavaTimeModule javaTimeModule = new JavaTimeModule(); // LocalDateTime序列化和反序列化 javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN))); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN))); // LocalDate序列化和反序列化 javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_PATTERN))); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_PATTERN))); // LocalTime序列化和反序列化 javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_PATTERN))); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_PATTERN))); objectMapper.registerModule(javaTimeModule); // 配置序列化特性 // 禁用将日期序列化为时间戳 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用将日期作为时间戳写入 objectMapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS); // 配置反序列化特性 // 忽略未知属性 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 允许空对象 objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); return objectMapper; } }配置内容
注册JavaTimeModule模块
- 支持Java 8时间类型的序列化和反序列化
配置日期时间格式
LocalDateTime:yyyy-MM-dd HH:mm:ssLocalDate:yyyy-MM-ddLocalTime:HH:mm:ss
其他配置
- 禁用将日期序列化为时间戳
- 忽略未知属性
- 允许空对象
使用示例
实体类定义
@Data public class BaseEntity { private Long id; private LocalDateTime createTime; // 自动格式化为 yyyy-MM-dd HH:mm:ss private LocalDateTime updateTime; // 自动格式化为 yyyy-MM-dd HH:mm:ss }API返回示例
{ "code": 200, "success": true, "data": { "id": 1, "username": "admin", "createTime": "2025-01-15 10:30:00", "updateTime": "2025-01-15 10:30:00" } }API请求示例
{ "username": "test", "realName": "测试用户", "createTime": "2025-01-15 10:30:00" }注意事项
全局配置
- 所有的
LocalDateTime、LocalDate、LocalTime字段都会自动应用配置的格式 - 不需要在每个字段上添加
@JsonFormat注解
- 所有的
自定义格式
- 如果某个字段需要特殊格式,可以使用
@JsonFormat注解覆盖全局配置
@JsonFormat(pattern = "yyyy/MM/dd") private LocalDate specialDate;- 如果某个字段需要特殊格式,可以使用
时区问题
- 当前配置使用系统默认时区
- 如需指定时区,可以在
@JsonFormat中添加timezone属性
兼容性
- 配置已添加到Spring容器中,自动应用于所有HTTP请求和响应
- 也适用于手动使用
ObjectMapper进行序列化和反序列化
相关依赖
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>此依赖已在pom.xml中配置,Spring Boot会自动管理版本。