如何在自动配置的基础上定义ObjectMapper?
在我的新应用中,我正在使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。