jackson Spring:两种ObjectMapper配置

yuvru6vn  于 2022-11-08  发布在  Spring
关注(0)|答案(1)|浏览(247)

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

  1. @Bean
  2. @Primary
  3. public ObjectMapper newJacksonJsonProvider() {
  4. SimpleModule module = new SimpleModule();
  5. module.addDeserializer(ZonedDateTime.class, new ZonedDateTimeCustomDeserializer());
  6. return new ObjectMapper()
  7. .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
  8. .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
  9. .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
  10. .registerModule(new ParameterNamesModule())
  11. .registerModule(module);
  12. }

对于其余的控制器,我需要一个基本的。或者只是一个不会与上述一个冲突。
另外,我使用的是多模块的项目,所以,也许有一种可能性,如何分离它,所以不会有冲突。

des4xlb0

des4xlb01#

因此,如果您真的只需要两个ObjectMapper示例,那么我建议您实际上应该将另一个示例设置为@Primary,并使用@Qualifier注解将自定义示例注入到您特别需要它的任何位置,如下所示:

  1. @Bean(name = "defaultObjectMapper")
  2. @Primary
  3. ObjectMapper defaultObjectMapper() {
  4. return new ObjectMapper();
  5. }
  6. @Bean(name = "customizedObjectMapper")
  7. ObjectMapper customizedObjectMapper() {
  8. var objectMapper = new ObjectMapper();
  9. //customization goes here
  10. return objectMapper;
  11. }

然后,您可以在需要的地方自动连接自定义设备,如下所示:

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

但是,由于您特别提到了Kafka,我觉得您可能更愿意为Kafka专门配置JsonSerializer/Deserializer,而不将自定义的ObjectMapper公开为bean。(有关使用Kafka自定义序列化程序/反序列化程序的详细信息,请参阅Spring Kafka文档)

展开查看全部

相关问题