Spring: ObjectMapper的两个配置



我在Spring Boot项目中同时使用Kafka和@RestController。我需要为@RestController和我的Kafka类声明两个不同的ObjectMapper (Jackson)配置。其中一个是Kafka的,看起来像这样:

@Bean
@Primary
public ObjectMapper newJacksonJsonProvider() {
SimpleModule module = new SimpleModule();
module.addDeserializer(ZonedDateTime.class, new ZonedDateTimeCustomDeserializer());
return new ObjectMapper()
.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(new ParameterNamesModule())
.registerModule(module);
}
对于其他控制器,我需要一个基本的。或者只是一个不会与上面的冲突的。

另外,我使用一个多模块项目。所以,也许有一种可能如何把它分开,这样就不会有碰撞。

所以如果你真的只需要两个ObjectMapper实例,那么我建议你应该让另一个实例成为@Primary,并在你特别需要它的地方注入自定义的,使用@Qualifier注释,像这样:

@Bean(name = "defaultObjectMapper")
@Primary
ObjectMapper defaultObjectMapper() {
return new ObjectMapper();
}
@Bean(name = "customizedObjectMapper")
ObjectMapper customizedObjectMapper() {
var objectMapper = new ObjectMapper();
//customization goes here
return objectMapper;    
}

然后你可以在你需要的地方自动安装自定义的,像这样:

//constructor for a service that requires the custom ObjectMapper
ServiceUsingAutowiredObjectMapper(@Qualifier("customizedObjectMapper") ObjectMapper objectMapper) {
//code goes here
}

然而,既然你特别提到了Kafka,我觉得你可能更愿意为Kafka配置JsonSerializer/Deserializer,而不是将定制的ObjectMapper暴露为bean。(有关kafka使用自定义序列化器/反序列化器的详细信息,请参阅spring kafka文档)

最新更新