Spring Boot配置ObjectMapper全局序列化LocalDateTime格式不生效
问题根因
你手动注册的ObjectMapper Bean未被Spring MVC用于HTTP响应序列化。Spring Boot Web组件的MappingJackson2HttpMessageConverter默认通过Jackson2ObjectMapperBuilder构建独立的ObjectMapper实例,不会直接复用你手动new并注册的Bean,因此你手动注入调用时配置生效,Controller返回JSON时走的是未配置的默认实例,时间就会输出ISO-8601格式的2022-06-30T22:44:11。
全局生效配置方案
方案1:使用Jackson2ObjectMapperBuilderCustomizer扩展(官方推荐)
无需自行定义ObjectMapper Bean,直接注册定制器修改Spring Boot自动构建的全局ObjectMapper实例,Controller序列化、全局注入的ObjectMapper等所有场景都会统一生效,且保留Spring Boot默认的Jackson优化配置,不会引入额外兼容问题,代码如下:
@Bean public Jackson2ObjectMapperBuilderCustomizer jacksonGlobalTimeCustomizer() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm"); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); return builder -> { builder.modules(javaTimeModule); builder.featuresToDisable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, SerializationFeature.WRITE_DATES_WITH_CONTEXT_TIME_ZONE, DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES ); }; }
方案2:显式替换MVC消息转换器(适配已有自定义ObjectMapper的场景)
如果你需要保留当前自定义ObjectMapper的写法,直接显式将该Bean注入到Jackson的HTTP消息转换器中,覆盖默认实例即可:
@Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) { return new MappingJackson2HttpMessageConverter(objectMapper); }
注意该方案需要确保你自定义的ObjectMapper已经加载了Spring Boot默认的Jackson扩展模块(比如参数名解析、空值序列化规则等),否则可能出现其他序列化异常。
避坑说明
- 配置文件中的
spring.jackson.date-format参数仅对java.util.Date、java.util.Calendar等旧时间类型生效,对LocalDateTime、LocalDate等Java 8+时间类型无效,无需额外配置该参数。 - 如果项目中引入了fastjson、gson等其他JSON序列化依赖,请检查对应HttpMessageConverter的优先级,若优先级高于Jackson转换器会导致序列化完全不走Jackson,配置自然不生效。
- 以上两种方案均为全局生效,无需在任何时间字段上添加
@JsonFormat类的注解单独指定格式。
内容的提问来源于stack exchange,提问作者Rafael Lima
相关产品推荐
相关产品推荐

