【问题标题】:How to customise Jackson in Spring Boot 1.4如何在 Spring Boot 1.4 中自定义 Jackson
【发布时间】:2017-01-08 20:48:48
【问题描述】:

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

在 boot 1.4 中自定义 Jackson 的文档 - https://docs.spring.io/spring-boot/docs/1.4.x/reference/htmlsingle/#howto-customize-the-jackson-objectmapper

我的配置有效,但我不确定这是否是使用 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 启动项目中,它只是自动配置一些东西,比如 ControllerAdvice 和一些像上面这样的琐碎功能。

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

【问题讨论】:

    标签: java spring spring-boot jackson


    【解决方案1】:

    要自定义 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 {
            ...
        }
    
        ...
    
    }
    

    【讨论】:

    • 看准了!这是我最初尝试做的,但一定是做错了什么,谢谢。
    【解决方案2】:

    这取决于你想要做什么。

    如果除了默认执行的自定义之外,您还想进行一些自定义,那么您应该创建自己的 Jackson2ObjectMapperBuilderCustomizer 实现并将其公开为 bean。您目前拥有的是一个更复杂的版本。与其注入定制器然后自己调用它们,不如创建自己的定制器 bean,Boot 会为您调用它。

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

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

    【讨论】:

    • 谢谢这是我最初所做的,但它似乎没有效果。我明天会发布我的代码,也许你可以告诉我哪里没有错。至于您通过属性文件配置它的建议,我已经更新了我的问题,以提供更多关于我如何使用此配置类的上下文。
    【解决方案3】:

    只需创建一个ObjectMapper bean:

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

    【讨论】:

    • 抱歉,我可能更清楚地表明我实际上是在扩展对象映射器功能。而您的建议实际上会覆盖任何 ObjectMapper bean,例如默认的一个 spring boot 配置
    • 这对于 Spring Boot 来说不是很好的方法,因为可以有多个 jackson 定制器,并且返回构建的对象映射器实例使它们完全无用。
    猜你喜欢
    • 2017-08-10
    • 2020-05-20
    • 2021-01-24
    • 2021-01-02
    • 2020-07-03
    • 1970-01-01
    • 2015-04-04
    • 2016-07-09
    • 1970-01-01
    相关资源
    最近更新 更多