web-dev-qa-db-ja.com

@RestControllerと@RepositoryRestResourceを使用する場合

[〜#〜] rest [〜#〜]でSpringを使用する方法のさまざまな例を見てきました。最終ターゲットはSpring HATEOAS/HAL セットアップ

[〜#〜] rest [〜#〜] within Spring

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

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

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

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

74
code

わかりましたので、短い話は_@RepositoryRestResource_を使用したいということです。これは[〜#〜] hateoas [〜#〜]サービスをSpring JPA

here このアノテーションを追加してPojoにリンクすると、完全に機能する[〜#〜] hateoas [〜#〜]サービスが表示されますリポジトリメソッドまたはRESTサービスメソッドを実装する必要なし

_@RestController_を追加する場合、公開したい各メソッドを独自に実装する必要があり、これを[〜#〜] hateoas [〜#〜にエクスポートしません] フォーマット。

51
zpontikas

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

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

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

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

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

32
Jacob Creed

さて、上記の答えはその文脈において正しいですが、私はあなたに実際的な例を与えています。

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-no-controller

15
shaILU

_@RepositoryRestController_は、公開されたリポジトリからデフォルトで生成されたSpring Data RESTコントローラをオーバーライドします。

Spring Data RESTの設定、メッセージコンバーター、例外処理などを活用するには、標準のSpring MVC _@RepositoryRestController_または_@Controller_の代わりに_@RestController_注釈を使用します

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

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

_@ResponseBody_が欠落しているため、_@RepositoryRestController_を追加することに注意してください

リポジトリを公開していない場合(@RepositoryRestResource(exported = false)としてマーク)、代わりに_@BasePathAwareController_注釈を使用します

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

ControllerLinkBuilderはSpring Data RESTのベースパスを考慮せず、_@RequestMapping_はクラス/タイプレベルで使用しないでください

そして

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

リンクを修正する回避策: https://stackoverflow.com/a/51736503/54847

更新:最後に、多くの回避策のために_@RepositoryRestController_を使用しないことを好みます。

6
GKislin