簡體   English   中英

如何在 Spring Boot 1.4 中自定義 Jackson

[英]How to customise Jackson in Spring Boot 1.4

我一直無法找到有關如何在 spring boot 1.4 中使用Jackson2ObjectMapperBuilderCustomizer.java來自定義 Jackson 功能的示例。

在 boot 1.4 中自定義 Jackson 的 doco - 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 或其他包提供的任何配置。

為了自定義已經由 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 {
        ...
    }

    ...

}

這取決於你想要做什么。

如果您想在默認情況下進行一些自定義,那么您應該創建自己的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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM