JSON 出力のカスタマイズ
アプリケーションでは、特定のエンティティから他のリソースへのリンクを提供する必要がある場合があります。例: Customer
レスポンスは、現在のショッピングカートへのリンクまたはそのエンティティに関連するリソースを管理するためのリンクで強化される場合があります。Spring Data REST は Spring 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
実装を返すことができます。