如何在Spring Boot 1.4中自定义Jackson

我一直无法找到如何在spring boot 1.4中使用Jackson2ObjectMapperBuilderCustomizer.java来自定义Jackson的function的示例。

用于在启动1.4中定制Jackson的doco – http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-

我的配置工作,虽然我不确定这是否是使用Jackson2ObjectMapperBuilderCustomizer.java自定义对象映射器的正确方法

@Configuration public class JacksonAutoConfiguration { @Autowired private Environment env; @Bean public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder( List customizers) { Jackson2ObjectMapperBuilder builder = configureObjectMapper(); customize(builder, customizers); return builder; } private void customize(Jackson2ObjectMapperBuilder builder, List customizers) { for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) { customizer.customize(builder); } } private Jackson2ObjectMapperBuilder configureObjectMapper() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); List activeProfiles = asList(env.getActiveProfiles()); if (activeProfiles.contains(SPRING_PROFILE_DEVELOPMENT)) { builder.featuresToEnable(SerializationFeature.INDENT_OUTPUT); } return builder; } } 

为了提供一些上下文,这个类位于我自己的REST服务的spring starter项目中,它只是自动配置一些东西,比如ControllerAdvice和一些简单的function,如上所述。

所以我的目标是扩展Jackson配置而不是覆盖引导或其他包提供的任何配置。

要自定义已经由Spring Boot预先配置的Jackson ObjectMapper ,我能够做到这一点(这里的示例是添加自定义反序列化器)。

配置类:

 @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); } }; } ... } 

和我的自定义反序列化器,以显示Spring如何获取它:

 @Component public class BigDecimalDeserializer extends StdDeserializer { public BigDecimalDeserializer() { super(BigDecimal.class); } @Override public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { ... } ... } 

这取决于你想要做什么。

如果你想在默认情况下执行一些自定义操作,那么你应该创建自己的Jackson2ObjectMapperBuilderCustomizer实现并将其作为bean公开。 你现在拥有的是一个更复杂的版本。 您可以只创建自己的定制器bean,而不是让定制器注入,然后自己调用它们,而Boot会为您调用它。

如果要完全控制并关闭所有Boot的自定义,则创建一个Jackson2ObjectMapperBuilderObjectMapper bean并根据需要进行配置。 首选构建器方法,因为此构建器还用于配置由其他组件(如Spring Data REST)创建的ObjectMappers。

查看您的代码并退后一步,您可以通过使用特定于配置文件的配置文件(类似于application-dev.properties )来更简单地配置事物,以便缩进Jackson的输出。 你可以在这里阅读更多相关信息。

只需创建一个ObjectMapper bean:

 @Bean ObjectMapper objectMapper() { return Jackson2ObjectMapperBuilder .json() .featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION) .build(); }