web-dev-qa-db-ja.com

Spring Boot 1.4でJacksonをカスタマイズする方法

ジャクソンの機能をカスタマイズするために、スプリングブート1.4でJackson2ObjectMapperBuilderCustomizer.Javaを使用する方法の例を見つけることができませんでした。

ブート1.4でJacksonをカスタマイズするためのドコ- 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= ControllerAdviceや上記のような些細な機能など、多くのことを自動構成するサービス用の独自のSpring Starterプロジェクトにあります。

したがって、私の目標は、ブートまたは他のパッケージによって提供される構成をオーバーライドするのではなく、ジャクソン構成を拡張することです。

20
Reece

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 {
        ...
    }

    ...

}
30
Mark

それはあなたが何をしようとしているかに依存します。

デフォルトで実行されるものに加えていくつかのカスタマイズを行いたい場合は、独自のJackson2ObjectMapperBuilderCustomizer実装し、Beanとして公開します。あなたが現在持っているのは、これのより複雑なバージョンです。カスタマイザを挿入してから自分で呼び出すのではなく、独自のカスタマイザBeanを作成するだけで、Bootがそれを呼び出します。

完全に制御し、Bootのすべてのカスタマイズをオフにする場合は、Jackson2ObjectMapperBuilderまたはObjectMapper Beanを使用して、必要に応じて構成します。このビルダーは、Spring Data RESTなどの他のコンポーネントによって作成されたObjectMappersの構成にも使用されるため、ビルダーアプローチが推奨されます。

コードを見て、一歩後退すると、プロファイル固有の構成ファイル(application-dev.properties)Jacksonの出力のインデントを有効にします。詳細については、こちらをご覧ください こちら

7
Andy Wilkinson

ObjectMapper Beanを作成するだけです:

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