JAX-RSプロバイダーとは何か、「@ Provider」アノテーションは何をするのか、誰かに説明してもらえますか?ドキュメントを読んでいますが、わかりません。
着信要求を処理するリソースクラスがある場合、プロバイダーは何をしますか?永続的なリソースクラス(リクエストごとではないもの)を作成する場合、それらはシングルトンリソースクラスとどのように異なりますか?それとも、それらのクラスはプロバイダーでもありますか?
3 に答える
プロバイダーは、JAX-RSランタイムを拡張およびカスタマイズするための単純な方法です。それらは、一連の(プログラムで定義された)目標を達成するために、ランタイムの動作を(潜在的に)変更するプラグインと考えることができます。
プロバイダーはリソースクラスと同じではなく、概念的には、リソースクラスとJAX-RS実装の間のレベルに存在します。それが役立つ場合は、デバイスドライバー(ユーザースペースとカーネルスペースの間に存在する)と同じ観点からそれらを考えることができます。これは幅広い一般化です。
現在のJAX-RS仕様で定義されているプロバイダーには3つのクラスがあります。それらの間の共通点は、すべてのプロバイダーが@Providerアノテーションによって識別され、コンストラクター宣言の特定のルールに従う必要があることです。それとは別に、異なるプロバイダータイプには追加のアノテーションがあり、異なるインターフェイスを実装します。
エンティティプロバイダー
これらのプロバイダーは、同等のJavaオブジェクトへのデータ表現(XML、JSON、CSVなど)のマッピングを制御します。
コンテキストプロバイダー
これらのプロバイダーは、リソースが@Contextアノテーションを介してアクセスできるコンテキストを制御します。
例外プロバイダー
これらのプロバイダーは、Java例外のJAX-RSResponseインスタンスへのマッピングを制御します。
ランタイムには、基本レベルの機能の実装を担当する多数の事前定義されたプロバイダーが付属しています(たとえば、XMLとの間のマッピング、最も一般的な例外の変換など)。必要に応じて、独自のプロバイダーを作成することもできます。
JAX-RS仕様は、これらのさまざまなプロバイダーの種類とその機能を理解するための優れたリファレンスです(第4章を参照)。
@Providerアノテーションは、 MessageBodyReaderやMessageBodyWriterなど、 JAX-RSランタイムに関係するすべてのものに使用されます。HTTPリクエストの場合、MessageBodyReaderを使用して、HTTPリクエストエンティティの本体をメソッドパラメータにマップします。応答側では、MessageBodyWriterを使用して、戻り値がHTTP応答エンティティ本体にマップされます。アプリケーションがHTTPヘッダーや別のステータスコードなどの追加のメタデータを提供する必要がある場合、メソッドはエンティティをラップし、Responseを使用して構築できるResponseを返すことができます。ResponseBuilder。
@Providerアノテーションを使用すると、生のXMLレベルで着信メッセージと発信メッセージを調べることができます。このように、ProviderはクライアントのDispatchに対応します。
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 {
...