JAX-RSのプロバイダーとはどういう意味ですか?


110

誰かがJAX-RSプロバイダーとは何か、そして '@Provider'アノテーションが何をするのか私に説明できますか?ドキュメントを読んでいますが、それを取得できません。
着信要求を処理するリソースクラスがある場合、プロバイダーは何をしますか?永続リソースクラス(リクエストごとではないクラス)を作成する場合、それらはシングルトンリソースクラスとどのように異なりますか?またはそれらのクラスもプロバイダーですか?


これに合わせて:なぜJAX-RSドキュメントでは、「プロバイダー」の章の最初の段落でこれについて説明していないのです。JAX-RSドキュメンテーションPDF
Jonathan Komar

回答:


138

プロバイダーは、JAX-RSランタイムを拡張およびカスタマイズするための単純な方法です。これらは、(プログラムで定義された)一連の目標を達成するために、ランタイムの動作を(潜在的に)変更するプラグインと考えることができます。

プロバイダーはリソースクラスと同じではありません。概念的には、リソースクラスとJAX-RS実装の間のレベルに存在します。それが役立つ場合は、デバイスドライバーと同じ観点から考えることができます(ユーザースペースとカーネルスペースの間に存在します)。これは広い一般化です。

現在のJAX-RS仕様で定義されているプロバイダーの3つのクラスがあります。それらの共通点は、すべてのプロバイダーが@Providerアノテーションで識別され、コンストラクター宣言の特定の規則に従う必要があることです。それとは別に、異なるプロバイダータイプには追加の注釈があり、異なるインターフェイスを実装します。


エンティティプロバイダー

これらのプロバイダーは、対応するJavaオブジェクトへのデータ表現(XML、JSON、CSVなど)のマッピングを制御します。

コンテキストプロバイダー

これらのプロバイダーは、リソースが@Contextアノテーションを介してアクセスできるコンテキストを制御します。

例外プロバイダー

これらのプロバイダーは、Java例外からJAX-RS応答インスタンスへのマッピングを制御します。


ランタイムには、基本レベルの機能の実装(たとえば、XMLへのマッピング、XMLからのマッピング、最も一般的な例外の変換など)を行う多数の事前定義されたプロバイダーが付属しています。必要に応じて、独自のプロバイダーを作成することもできます。

JAX-RS仕様は、これらの異なるプロバイダの種類とどのような彼らは(第4章を参照してください)ない上に読み取るための良いリファレンスです。


ありがとう。私は物事のアイデアを得たと思います=)
Artem Moskalev

よく@Perceptionを説明しました。これは私の理解に本当に役立ちました。
L-Samuels

よく説明しました。しかし、1つの質問-@providerの実装は、web.xmlのinit param(jersey.config.server.provider.classnames)を介して挿入されたjavax.ws.rs.core.Featureインターフェースの実装とどのように異なりますか?注文はどのように管理されますか?
アンディDufresne 2017

JAX-RS仕様の最新バージョンに注意してください(バージョン2.1、最終リリース2017年7月13日)download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/...
burntsugar

13

@Providerの注釈は、に興味がある何のために使用されているランタイムJAX-RSのような、MessageBodyReaderのMessageBodyWriter。HTTPリクエストの場合、MessageBodyReaderを使用して、HTTPリクエストのエンティティ本体をメソッドパラメータにマップします。応答側では、戻り値はMessageBodyWriterを使用してHTTP応答エンティティ本体にマップされます。アプリケーションがHTTPヘッダーや別のステータスコードなどの追加のメタデータを提供する必要がある場合、メソッドはエンティティをラップし、Responseを使用して構築できるResponseを返すことができます。ResponseBuilder

@Providerアノテーションを使用すると、未加工のXMLレベルで着信メッセージと発信メッセージを調べることができます。このように、プロバイダーはクライアントでのDispatchに対応します。


6

Filtering-Request / Response、例外処理などの特定のアクティビティを実行するために、JAX-RSには独自のデフォルト実装ロジックがあります。ただし、ユーザーは独自の実装を提供することもできます。

独自の実装を提供するには、@ Providerアノテーションで指定することにより、適切なクラスを実装する必要があります。

JAX-RSは、@ Providerアノテーションを検索することにより、そのようなユーザー定義の実装の存在を見つけるために一連のスキャンを実行します。

例えば:

...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...

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