如何在Spring Boot 1.4

时间:2016-09-01 05:47:28

标签: java spring spring-boot jackson

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

用于在启动时定制杰克逊的doco 1.4 - 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<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;
    }
}

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

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

3 个答案:

答案 0 :(得分:28)

要自定义已经由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<BigDecimal> {

    public BigDecimalDeserializer() {
        super(BigDecimal.class);
    }

    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        ...
    }

    ...

}

答案 1 :(得分:7)

这取决于你想要做什么。

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

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

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

答案 2 :(得分:2)

just create an ObjectMapper bean:

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