如何在Spring Boot 1.4中自定义Jackson

2022-09-01 22:52:12

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

用于在靴子中自定义杰克逊的 doco 1.4 - 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服务的弹簧启动器项目中,该项目只是自动配置许多东西,如ControrAdvice和一些琐碎的功能,如上面。

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


答案 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

这取决于你想做什么。

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

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

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


推荐