最新の安定バージョンについては、Spring Data REST 4.5.5 を使用してください! |
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 実装を返すことができます。