@RestControllerと@RepositoryRestResourceをいつ使用するか


87

私はRESTでSpringを使用する方法のさまざまな例を見てきました。私たちの最終目標は春のHATEOAS/HALセットアップです

Spring内でRESTをレンダリングするための2つの異なる方法を見てきました

  1. @RestControllerコントローラ内経由

  2. @RepositoryRestResourceリポジトリ内経由

私が見つけるのに苦労しているのは、なぜ一方を他方の上に使用するのかということです。HALどちらが最適かを実装しようとすると?

私たちのデータベースバックエンドはNeo4jです。

回答:


61

さて@RepositoryRestResource、これはSpring JPAでHATEOASサービスを作成するので、簡単に言うと、使用したいということです。

ここでわかるよう、このアノテーションを追加してPojoにリンクすると、リポジトリメソッドやRESTサービスメソッドを実装しなくても、完全に機能するHATEOASサービスを利用できます。

追加する場合は、@RestController公開する各メソッドを独自に実装する必要があります。また、これはHATEOAS形式にエクスポートされません。


7
デフォルトでは、Spring DataRESTはすべてのトップレベルのパブリックインターフェイスリポジトリをエクスポートします。@RepositoryRestResourceが必要なのは、インターフェースをエクスポートしないか、エンドポイントの詳細を変更するためだけです。
gregturn 2015

4
Spring Data RESTでRestControllerを使用する場合、Spring DataRESTが提供するすべてのものを回避します。SpringデータRESTのメッセージコンバーターなどを使用するカスタムSpringMVCコントローラーをコーディングするには、BasePathAwareControllerを調べます。
gregturn 2015

受け入れられた答えは正しいとは思いません@gregturnの方が良い答えです。
マーク

39

概説していない3番目(および4番目)のオプションがあります。これは、エンティティ固有のアクションを実行しているかどうかに応じて、@ BasePathAwareControllerまたは@RepositoryRestControllerのいずれかを使用することです。

@RepositoryRestResourceは、パブリックリポジトリインターフェイスのオプションを設定するために使用されます。拡張されるリポジトリのタイプ(CrudRepository / PagingAndSortingRepositoryなど)に基づいて、必要に応じてエンドポイントが自動的に作成されます。

@BasePathAwareControllerと@RepositoryRestControllerは、エンドポイントを手動で作成するが、設定したSpring DataREST構成を使用する場合に使用されます。

@RestControllerを使用する場合、異なる構成オプション(つまり、異なるメッセージコンバーター、異なるエラーハンドラーなど)を使用してエンドポイントの並列セットを作成しますが、それらはうまく共存します(おそらく混乱を引き起こします)。

特定のドキュメントはここにあります


6
これはもはや真実ではないと思います。@RestControllerがと同じパスを使用する場合、@RepositoryRestResourceリポジトリエンドポイントは作成されません。
Hubert Grzeskowiak 2017年

19

さて、上記の答えは彼らの文脈では正しいですが、それでも私はあなたに実際的な例を挙げています。

多くのシナリオでは、APIの一部として、特定の基準に基づいてエンティティを検索するためのエンドポイントを提供する必要があります。JPAを使用すると、クエリを作成する必要もありません。Spring-JPAの特定の命名法でインターフェイスとメソッドを作成するだけです。このようなAPIを公開するには、これらのリポジトリメソッドを呼び出すだけのサービスレイヤーを作成し、最後にサービスレイヤーを呼び出すことでエンドポイントを公開するコントローラーを作成します。

Springがここで行ったことにより、これらのエンドポイントを、通常は検索エンティティへのGET呼び出しであり、バックグラウンドで最終エンドポイントを作成するために必要なファイルを生成するようなインターフェイス(リポジトリ)から公開できます。したがって、@ RepositoryRestResourceを使用している場合は、サービス/コントローラーレイヤーを作成する必要はありません。

一方、@ RestControllerは、jsonデータを具体的に処理するコントローラーであり、残りはコントローラーとして機能します。つまり、@ Controller + @ResponseBody = @ RestControllerです。

お役に立てれば。

同じことについては、私の作業例とブログを参照して
くださいhttp//sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with -hibernate-コントローラーなし


私のブログにアクセスしている人を見ることができます。このソリューションが機能する場合は、投票してください。
shaILU 2016年

10

@RepositoryRestController 公開されたリポジトリからデフォルトで生成されたSpringDataRESTコントローラーをオーバーライドします。

Spring Data RESTの設定、メッセージコンバーター、例外処理などを利用する@RepositoryRestControllerには、標準のSpringMVC@Controllerまたは@RestController

たとえば、このコントローラーはspring.data.rest.basePath、ルーティングのベースパスとしてSpringBoot設定を使用します。

Spring DataREST応答ハンドラーのオーバーライドを参照してください。

@ResponseBody見逃しているので追加に注意してください@RepositoryRestController

リポジトリ(としてマークされている@RepositoryRestResource(exported = false))を公開していない場合は、@BasePathAwareController代わりにアノテーションを使用してください

バッグにも注意してください

ControllerLinkBuilderSpring Data RESTのベースパスを考慮に入れて@RequestMappingいないため、クラス/タイプレベルで使用しないでください

そして

ベースパスがHALに表示されない

リンクを修正するための回避策:https//stackoverflow.com/a/51736503/548473

更新:@RepositoryRestController多くの回避策があるため、ついに使用したくない。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.