我有一个由 spring boot 隐式设置的 objectMapper bean,我想添加
this.objectMapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
没有:
@Bean
public ObjectMapper configure(){
ObjectMapper om = new ObjectMapper();
om.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
}
因为它重新创建了 bean 然后对其进行配置,所以我只想对 bean 做一些小小的改变,而不需要从头开始重新创建它,从而弄乱 spring 所做的隐式配置。
使用
spring.jackson.*
属性Spring Boot 已经自动配置了 Jackson 。您可以通过提供属性来
ObjectMapper
向自动配置中添加属性。例如:ObjectMapper
spring.jackson.deserialization.*
类似地,还有
spring.jackson.serialization.*
和spring.jackson.mapper.*
属性。使用
Jackson2ObjectMapperBuilderCustomizer
另外,你也可以声明一个
Jackson2ObjectMapperBuilderCustomizer
来代替。例如:定制器的一般使用
如果您正在谈论如何添加属性或如何自定义任何 bean,那么使用定制器的模式在 Spring Boot 中被广泛采用,您可以做类似的事情。
例如,假设您正在尝试配置一个
Foo
bean,并且您有一个如下的构建器:你可以做的是定义你自己的
FooCustomizer
功能接口,如下所示:(请注意,如果您使用 Lombok 生成构建器,则构建器类将默认命名
Foo.FooBuilder
为 而不是Foo.Builder
)然后你可以像这样使用它们:
请注意,此示例依赖于可变的构建器。如果您使用的是不可变的构建器,则可能需要将
forEach()
末尾的替换为reduce()
运算符。您可以通过声明定制器 bean 来定制生成的 Jackson,
ObjectMapper
以应用功能更改或其他配置更改,如下所示:ObjectMapper
然后它将在应用程序启动期间创建共享并被应用。另一种方法是考虑应用配置属性,该属性通常可用于实现类似的效果。您可以从这里查看所有受支持的属性:https://docs.spring.io/spring-boot/appendix/application-properties/index.html#application-properties.json.spring.jackson.constructor-detector - 因此声明
spring.jackson.deserialization.read-unknown-enum-values-using-default-value=true
在您的 application.properties (或 YAML 文件)中应该启用相同的功能而不需要额外的 bean。