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