Spring Boot 2.7.8配置Jackson全局日期格式失效求助
问题背景
- Spring Boot版本:2.7.8
- 需求:全局配置
java.util.Date及java.time.*下所有日期时间类型的序列化格式,避免序列化为时间戳(长数字)
已尝试的方案
1. application.yml配置
app: dateFormat: "yyyy/MM/dd" timeFormat: "HH:mm:ss" spring: jackson: date-format: "yyyy-MM-dd HH:mm:ss"
结果:所有日期类型仍被序列化为长数字
2. JacksonConfig配置类
@Configuration public class JacksonConfig { @Value("${app.dateFormat}") private String dateFormat; @Value("${app.dateFormat} ${app.timeFormat}") private String dateTimeFormat; @Bean public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { System.out.println("---------------"); return builder -> { builder.simpleDateFormat(dateFormat); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); }; } }
结果:配置类已被Spring加载(打印语句执行),但日期类型仍序列化为长数字
3. 存在的WebConfig类
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.forEach(c -> { if(c instanceof MappingJackson2HttpMessageConverter) { MappingJackson2HttpMessageConverter jc = (MappingJackson2HttpMessageConverter)c; jc.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); } }); WebMvcConfigurer.super.extendMessageConverters(converters); } }
疑问:不确定该配置是否影响日期序列化
排查思路
1. 检查@EnableWebMvc的影响
@EnableWebMvc会禁用Spring Boot默认的Web MVC自动配置,包括Jackson的自动整合逻辑。你的WebConfig添加了该注解,可能导致JacksonConfig中的自定义配置未被正确应用到Web层的消息转换器:
- 临时注释
@EnableWebMvc,测试日期序列化是否恢复正常 - 若需保留
@EnableWebMvc,需在extendMessageConverters方法中直接配置ObjectMapper的序列化规则,替代Jackson2ObjectMapperBuilderCustomizer的方式
2. 补充完整的日期类型序列化/反序列化器
当前JacksonConfig仅配置了LocalDate和LocalDateTime的序列化器,缺少其他日期类型的支持:
- 为
java.util.Date显式添加序列化器(可覆盖默认的时间戳序列化) - 补充
LocalTime、ZonedDateTime等其他java.time.*类型的序列化器 - 按需添加对应反序列化器(若涉及前端传参反序列化)
示例补充代码:
// 配置java.util.Date序列化器 builder.serializers(new DateSerializer(false, new SimpleDateFormat(dateTimeFormat))); // 配置LocalTime序列化器 builder.serializers(new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat))); // 配置反序列化器 builder.deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat))); builder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
3. 关闭Jackson默认的时间戳序列化特性
Jackson默认会将日期类型序列化为时间戳,需显式关闭:
- 在JacksonConfig中添加:
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
- 或在application.yml中配置:
spring: jackson: serialization: write-dates-as-timestamps: false
4. 验证ObjectMapper的配置生效情况
在WebConfig的extendMessageConverters方法中添加日志,确认自定义序列化器是否已被注册到ObjectMapper:
if(c instanceof MappingJackson2HttpMessageConverter) { MappingJackson2HttpMessageConverter jc = (MappingJackson2HttpMessageConverter)c; ObjectMapper om = jc.getObjectMapper(); // 打印日期相关序列化器 om.getSerializers().forEach((k, v) -> { Class<?> type = k.getRawType(); if(type.isAssignableFrom(Date.class) || type.getPackage().getName().startsWith("java.time")) { System.out.println("已注册序列化器:" + type.getName() + " -> " + v.getClass().getName()); } }); om.setSerializationInclusion(JsonInclude.Include.NON_NULL); }
通过日志判断自定义序列化器是否被正确加载。
5. 检查实体类的局部格式化注解
若实体类的日期字段使用了@JsonFormat注解,会覆盖全局配置。逐一检查所有日期字段,移除或统一调整局部注解。
6. 确认Jackson时间类型依赖完整性
Spring Boot 2.7.8默认包含jackson-datatype-jsr310(处理java.time.*类型),但如果依赖被手动排除,会导致该类型无法被正确序列化。检查pom.xml或build.gradle,确保依赖存在:
Maven示例:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者WestFarmer
相关产品推荐
相关产品推荐

