java - 如何在不覆盖 Spring Boot 使用的 bean 的情况下定义自定义 ObjectMapper bean

标签 java spring-boot jackson

我有一个带有多个 @RestController 类的 Spring Boot Web 应用程序。 我喜欢我的 REST Controller 返回的默认 json 格式。

为了在我的 DAO bean(执行 json 序列化和反序列化)中使用,我创建了一个自定义 ObjectMapper:

@Configuration
public class Config{

  @Bean
  public ObjectMapper getCustomObjectMapper() {
    final ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategy.SnakeCaseStrategy());
    return objectMapper;
  }
}

在我的每个 DAO 类中,我 Autowiring 我的自定义 ObjectMapper:

@Repository
@Transactional
public class MyDaoImpl implements MyDao {

@Autowired
ObjectMapper objectMapper

//Dao implementation...

}

一切正常。问题是我的自定义 ObjectMapper 被 Spring 自动获取并用于序列化 REST 响应。
这是不希望的。对于 REST Controller ,我想保留 Spring 默认创建的 ObjectMapper

我如何告诉 Spring Boot 检测和将我的自定义 ObjectMapper bean 用于其内部工作?

最佳答案

Simone Pontiggia 的回答方向正确。您应该创建一个 @Primary bean,Spring 将在其内部使用它,然后创建您自己的 ObjectMapper bean 并使用 @Qualifier Autowiring 它们。

这里的问题是,创建默认 bean 如下:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return new ObjectMapper();
}

实际上不会按预期工作,因为 Spring 默认的 ObjectMapper 有额外的配置。 创建将由 spring 使用的默认 ObjectMapper 的正确方法是:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return Jackson2ObjectMapperBuilder.json().build();
}

您可以在此处找到有关 Spring 默认 ObjectMapper 的更多信息:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html 79.3 自定义 Jackson ObjectMapper

关于java - 如何在不覆盖 Spring Boot 使用的 bean 的情况下定义自定义 ObjectMapper bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49138936/

相关文章:

java - 如何使用默认区域解析 ZonedDateTime?

java - http-client 在 citrus-framework 中的 CustomCitrusHttpInterceptor

java - Jackson(fasterxml)反序列化的理解

java - JsonDeserializer 不处理空值

java - Subclipse 合并问题 - 试运行与合并结果不匹配

java - 如何创建具有离线和在线数据库并定期同步的 Java 桌面应用程序?

java - 身份验证过滤器无法正确识别身份验证

java - 返回空 JSON 的 Spring 应用程序

spring - 如何在 Spring Web MVC 中为所有 @RestController 设置上下文根?

java - 如何修复 FasterXml Jackson 中的 "Conflicting getter definitions for property"错误?