gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:47:59 25 4
gpt4 key购买 nike

我有一个带有多个 @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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com