如何在自动配置的基础上定义ObjectMapper?

后端开发 2026-07-11

在我的新应用中,我正在使用Spring Boot 4。

我注意到ObjectMapper现在位于 import tools.jackson.databind.ObjectMapper; 因此我想了解如何修改我在Spring Boot 3中使用的这个bean。

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder
            .featuresToEnable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
            .build();

    objectMapper.setTimeZone(TimeZone.getDefault());
    return objectMapper;
}

我想创建一个并非完全全新的bean,而是基于原始的 ObjectMapper 配置进行修改。也就是说,如果我在properties/yaml文件中定义了任何配置,我不想丢失它。

在上面描述的情形中,事实上,我有 ObjectMapper 的基础配置,加上我在属性文件中定义的内容,以及该方法中所做的配置。

解决方案

我通过阅读 这份迁移指南 找到了一个解决方案。

要能够修改默认的 ObjectMapper,你需要创建一个此类型的bean

@Bean
public JsonMapperBuilderCustomizer jacksonCustomizer() {
    return builder -> builder
            .defaultTimeZone(TimeZone.getDefault());
}

这样,你就不会失去自动配置,并且可以按自己的喜好自定义 objectMapper

然后我就可以把 objectMapper 注入到我的组件中。

如果你想从自动配置开始创建一个新的 ObjectMapper bean,可以这样做

@Bean("customObj")
public ObjectMapper customObj(ObjectMapper objectMapper) {
    return objectMapper
            .rebuild()
            .propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
            .build();
}

这样,我将永远无法完全替换Spring使用的原始bean,而只是创建一个新的名为 "customObj" 的bean,可以与 @Qualifier 一起使用。因此,改变原始bean的唯一方式就是上面所述的方法。

如果你想从头开始创建一个 objectMapper,而不考虑Spring Boot的自动配置,你需要这样做

ObjectMapper obj = JsonMapper
        .builder()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .build();
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章