JSON 出力のカスタマイズ

アプリケーションでは、特定のエンティティから他のリソースへのリンクを提供する必要がある場合があります。例: Customer レスポンスは、現在のショッピングカートへのリンクまたはそのエンティティに関連するリソースを管理するためのリンクで強化される場合があります。Spring Data RESTSpring HATEOAS [GitHub] (英語) との統合を提供し、クライアントに送信されるリソースの表現を変更できる拡張フックを提供します。

RepresentationModelProcessor インターフェース

Spring HATEOAS は、エンティティを処理するための RepresentationModelProcessor<> インターフェースを定義します。型 RepresentationModelProcessor<EntityModel<T>> のすべての Bean は、Spring Data REST エクスポーターによって自動的に選択され、型 T のエンティティをシリアライズするときにトリガーされます。

例: Person エンティティのプロセッサーを定義するには、次のような @Bean (Spring Data REST テストから取得) を ApplicationContext に追加します。

@Bean
public RepresentationModelProcessor<EntityModel<Person>> personProcessor() {

   return new RepresentationModelProcessor<EntityModel<Person>>() {

     @Override
     public EntityModel<Person> process(EntityModel<Person> model) {

      model.add(new Link("http://localhost:8080/people", "added-link"));
      return model;
     }
   };
}
上記の例では、localhost:8080/people へのリンクをハードコードしています。アプリ内にリンクしたい Spring MVC エンドポイントがある場合は、Spring HATEOAS の linkTo(…​) メソッドを使用して URL の管理を回避することを検討してください。

前の例に示すように、model.add(Link) を呼び出すことにより、エンティティのデフォルト表現へのリンクを追加できます。EntityModel に追加したリンクはすべて、最終出力に追加されます。

表現のカスタマイズ

Spring Data REST エクスポーターは、出力表現を作成する前に、検出された RepresentationModelProcessor インスタンスを実行します。これは、Converter<Entity, EntityModel> インスタンスを内部 ConversionService に登録することによって行われます。これは、参照されるエンティティ(オブジェクトの JSON 表現の _links プロパティにあるオブジェクトなど)へのリンクの作成を担当するコンポーネントです。@Entity を受け取り、そのプロパティを反復処理して、Repository によって管理されるプロパティへのリンクを作成し、埋め込まれたプロパティまたは単純なプロパティ間でコピーします。

ただし、プロジェクトで別の形式で出力する必要がある場合は、デフォルトの送信 JSON 表現を独自の表現に完全に置き換えることができます。独自の ConversionService を ApplicationContext に登録し、独自の Converter<Entity, EntityModel> を登録すると、選択した EntityModel 実装を返すことができます。