1. ホーム
  2. java

[解決済み] Spring Bootが暗黙的に使用するJackson JSONマッパーをカスタマイズする方法とは?

2022-05-17 19:30:36

質問

Spring Boot (1.2.1)を使用しています。 RESTfulなWebサービスの構築 チュートリアルにあるのと同じ方法です。

@RestController
public class EventController {
   @RequestMapping("/events/all")
   EventList events() {
       return proxyService.getAllEvents();
   }
}

上記のように、Spring MVCは暗黙のうちにJacksonを使用して私の EventList オブジェクトをJSONにシリアライズするためにJacksonを暗黙的に使用しています。

しかし、JSON形式に対して、次のような簡単なカスタマイズを行いたい。

setSerializationInclusion(JsonInclude.Include.NON_NULL)

質問です。 暗黙のJSONマッパーをカスタマイズする最も簡単な方法は何でしょうか?

でのアプローチを試しました。 このブログの記事 で、CustomObjectMapperの作成などをしていますが、ステップ3のquot;Springコンテキストへのクラス登録"で失敗しています。

org.springframework.beans.factory.BeanCreationException: 
  Error creating bean with name 'jacksonFix': Injection of autowired dependencies failed; 
  nested exception is org.springframework.beans.factory.BeanCreationException: 
  Could not autowire method: public void com.acme.project.JacksonFix.setAnnotationMethodHandlerAdapter(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter); 
  nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No qualifying bean of type [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]   
  found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

私は最新のSpring Bootでこれを動作させる簡単な方法を探している一方で、これらの手順はSpring MVCの古いバージョン用であるように見えます。

どのように解決するのですか?

プロパティのインクルージョンやその他多くの設定は application.properties :

spring.jackson.default-property-inclusion=non_null

の中にテーブルがあります。 ドキュメント に、使用可能なすべてのプロパティの一覧表があります。

もっとコントロールしたい場合は、Spring Bootの設定をプログラムでカスタマイズすることもできます。 Jackson2ObjectMapperBuilderCustomizer ビーンを使ってプログラム的にカスタマイズすることもできます。 のドキュメントで説明されています。 :

コンテキストの Jackson2ObjectMapperBuilder は、1つまたは複数の Jackson2ObjectMapperBuilderCustomizer ビーンによってカスタマイズできます。このようなカスタマイザービーンズは順序付けることができ(Boot 自身のカスタマイザーの順序は 0)、Boot のカスタマイズの前と後の両方に追加のカスタマイズを適用することが可能です。

最後に、Boot の設定を一切必要とせず ObjectMapper がどのように構成されるかを完全に制御したい場合は、独自の Jackson2ObjectMapperBuilder ビーンを宣言します。

@Bean
Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    // Configure the builder to suit your needs
    return builder;
}