You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:05:16