Tenho um bean objectMapper definido implicitamente pelo spring boot, gostaria de adicionar
this.objectMapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
sem:
@Bean
public ObjectMapper configure(){
ObjectMapper om = new ObjectMapper();
om.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
}
Como ele recria o bean e depois o configura, eu gostaria apenas de fazer uma pequena alteração no bean sem recriá-lo do zero, bagunçando as configurações implícitas feitas pelo spring.
Usando
spring.jackson.*
propriedadesO Spring Boot já autoconfigura um Jackson
ObjectMapper
. Você pode adicionar propriedades ao autoconfiguradoObjectMapper
fornecendo umaspring.jackson.deserialization.*
propriedade. Por exemplo:Da mesma forma, também existem propriedades
spring.jackson.serialization.*
espring.jackson.mapper.*
.Usando
Jackson2ObjectMapperBuilderCustomizer
Além disso, você também pode declarar um
Jackson2ObjectMapperBuilderCustomizer
em vez disso. Por exemplo:Usando personalizadores em geral
Se você estiver falando sobre como adicionar uma propriedade ou como personalizar qualquer bean em geral, então o padrão de uso de personalizadores é amplamente adotado no Spring Boot e você pode fazer algo semelhante.
Por exemplo, digamos que você esteja tentando configurar um
Foo
bean e tenha um construtor como este:O que você poderia fazer é definir sua própria
FooCustomizer
interface funcional assim:(observe que se você estiver usando o Lombok para gerar seus construtores, a classe do construtor será nomeada
Foo.FooBuilder
por padrão em vez deFoo.Builder
)E então você pode usá-los assim:
Esteja ciente de que este exemplo depende de construtores serem mutáveis. Se você estiver usando construtores imutáveis, provavelmente você vai querer substituir o
forEach()
no final por umreduce()
operador.Você pode personalizar o Jackson gerado
ObjectMapper
declarando um bean personalizador para aplicar as alterações de recursos ou outras alterações de configuração como esta:que será então aplicado quando o compartilhamento
ObjectMapper
for criado durante a inicialização do aplicativo.Outra alternativa é olhar para aplicar uma propriedade de configuração que pode frequentemente ser usada para atingir um efeito similar. Você pode ver todas as propriedades suportadas daqui para baixo: https://docs.spring.io/spring-boot/appendix/application-properties/index.html#application-properties.json.spring.jackson.constructor-detector - então declarando
spring.jackson.deserialization.read-unknown-enum-values-using-default-value=true
no seu application.properties (ou arquivo YAML) deve habilitar o mesmo recurso sem a necessidade do bean adicional.