java - jsonproperty - Cómo personalizar Jackson en Spring Boot 1.4
jackson parser java (3)
No he podido encontrar ejemplos de cómo usar Jackson2ObjectMapperBuilderCustomizer.java en Spring Boot 1.4 para personalizar las características de Jackson.
El documento para personalizar Jackson en el arranque 1.4 - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-
Mi configuración funciona, aunque no estoy seguro de si esta es la forma correcta de personalizar el mapeador de objetos utilizando Jackson2ObjectMapperBuilderCustomizer.java
@Configuration
public class JacksonAutoConfiguration {
@Autowired
private Environment env;
@Bean
public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(
List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
Jackson2ObjectMapperBuilder builder = configureObjectMapper();
customize(builder, customizers);
return builder;
}
private void customize(Jackson2ObjectMapperBuilder builder,
List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) {
customizer.customize(builder);
}
}
private Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
List<String> activeProfiles = asList(env.getActiveProfiles());
if (activeProfiles.contains(SPRING_PROFILE_DEVELOPMENT)) {
builder.featuresToEnable(SerializationFeature.INDENT_OUTPUT);
}
return builder;
}
}
Para proporcionar algo de contexto, esta clase se asienta en mi propio proyecto de inicio de Spring para servicios REST que solo configura automáticamente una serie de cosas, como ControllerAdvice y algunas características triviales como la anterior.
Por lo tanto, mi objetivo es extender la configuración de Jackson en lugar de anular cualquier configuración proporcionada por el arranque u otros paquetes.
Depende de lo que estés tratando de hacer.
Si desea realizar algunas personalizaciones adicionales a las que se realizan de forma predeterminada, debe crear su propia implementación Jackson2ObjectMapperBuilderCustomizer
y exponerla como un bean. Lo que tienes actualmente es una versión más compleja de esto. En lugar de inyectar los personalizadores y luego llamarlos usted mismo, puede crear su propio bean personalizado y Boot lo llamará por usted.
Si desea tomar el control completo y desactivar todas las personalizaciones de Boot, cree un Jackson2ObjectMapperBuilder
o ObjectMapper
y configúrelo según sea necesario. Se prefiere el enfoque del generador, ya que este generador también se usa para configurar los ObjectMappers creados por otros componentes como Spring Data REST.
Mirando su código y dando un paso atrás, puede configurar las cosas mucho más simplemente usando un archivo de configuración específico del perfil (algo como application-dev.properties
) para habilitar la sangría de la salida de Jackson. Puedes leer más sobre eso here .
Para personalizar el Jackson ObjectMapper
que ya está preconfigurado por Spring Boot, pude hacer esto (el ejemplo aquí es agregar un deserializador personalizado).
Clase de configuración:
@SpringBootConfiguration
public class Application {
@Autowired
private BigDecimalDeserializer bigDecimalDeserializer;
...
@Bean
public Jackson2ObjectMapperBuilderCustomizer addCustomBigDecimalDeserialization() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.deserializerByType(BigDecimal.class, bigDecimalDeserializer);
}
};
}
...
}
Y mi deserializador personalizado, para mostrar cómo lo recoge Spring:
@Component
public class BigDecimalDeserializer extends StdDeserializer<BigDecimal> {
public BigDecimalDeserializer() {
super(BigDecimal.class);
}
@Override
public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
...
}
...
}
solo crea un bean ObjectMapper
:
@Bean
ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder
.json()
.featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION)
.build();
}