web-dev-qa-db-ja.com

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

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

92
Artem Moskalev

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

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

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


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

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

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

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

例外プロバイダー

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


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

JAX-RS仕様 は、これらのさまざまなプロバイダータイプとそれらの機能について調べるための優れたリファレンスです(第4章を参照)。

117
Perception

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

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

9
A_BOSS

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

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

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

例えば:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
3
maris