誰かがJAX-RSプロバイダーとは何か、そして '@Provider'アノテーションが何をするのか私に説明できますか?ドキュメントを読んでいますが、それを取得できません。
着信要求を処理するリソースクラスがある場合、プロバイダーは何をしますか?永続リソースクラス(リクエストごとではないクラス)を作成する場合、それらはシングルトンリソースクラスとどのように異なりますか?またはそれらのクラスもプロバイダーですか?
誰かがJAX-RSプロバイダーとは何か、そして '@Provider'アノテーションが何をするのか私に説明できますか?ドキュメントを読んでいますが、それを取得できません。
着信要求を処理するリソースクラスがある場合、プロバイダーは何をしますか?永続リソースクラス(リクエストごとではないクラス)を作成する場合、それらはシングルトンリソースクラスとどのように異なりますか?またはそれらのクラスもプロバイダーですか?
回答:
プロバイダーは、JAX-RSランタイムを拡張およびカスタマイズするための単純な方法です。これらは、(プログラムで定義された)一連の目標を達成するために、ランタイムの動作を(潜在的に)変更するプラグインと考えることができます。
プロバイダーはリソースクラスと同じではありません。概念的には、リソースクラスとJAX-RS実装の間のレベルに存在します。それが役立つ場合は、デバイスドライバーと同じ観点から考えることができます(ユーザースペースとカーネルスペースの間に存在します)。これは広い一般化です。
現在のJAX-RS仕様で定義されているプロバイダーの3つのクラスがあります。それらの共通点は、すべてのプロバイダーが@Providerアノテーションで識別され、コンストラクター宣言の特定の規則に従う必要があることです。それとは別に、異なるプロバイダータイプには追加の注釈があり、異なるインターフェイスを実装します。
エンティティプロバイダー
これらのプロバイダーは、対応するJavaオブジェクトへのデータ表現(XML、JSON、CSVなど)のマッピングを制御します。
コンテキストプロバイダー
これらのプロバイダーは、リソースが@Contextアノテーションを介してアクセスできるコンテキストを制御します。
例外プロバイダー
これらのプロバイダーは、Java例外からJAX-RS応答インスタンスへのマッピングを制御します。
ランタイムには、基本レベルの機能の実装(たとえば、XMLへのマッピング、XMLからのマッピング、最も一般的な例外の変換など)を行う多数の事前定義されたプロバイダーが付属しています。必要に応じて、独自のプロバイダーを作成することもできます。
JAX-RS仕様は、これらの異なるプロバイダの種類とどのような彼らは(第4章を参照してください)ない上に読み取るための良いリファレンスです。
@Providerの注釈は、に興味がある何のために使用されているランタイムJAX-RSのような、MessageBodyReaderのとMessageBodyWriter。HTTPリクエストの場合、MessageBodyReaderを使用して、HTTPリクエストのエンティティ本体をメソッドパラメータにマップします。応答側では、戻り値はMessageBodyWriterを使用してHTTP応答エンティティ本体にマップされます。アプリケーションがHTTPヘッダーや別のステータスコードなどの追加のメタデータを提供する必要がある場合、メソッドはエンティティをラップし、Responseを使用して構築できるResponseを返すことができます。ResponseBuilder。
@Providerアノテーションを使用すると、未加工のXMLレベルで着信メッセージと発信メッセージを調べることができます。このように、プロバイダーはクライアントでのDispatchに対応します。
Filtering-Request / Response、例外処理などの特定のアクティビティを実行するために、JAX-RSには独自のデフォルト実装ロジックがあります。ただし、ユーザーは独自の実装を提供することもできます。
独自の実装を提供するには、@ Providerアノテーションで指定することにより、適切なクラスを実装する必要があります。
JAX-RSは、@ Providerアノテーションを検索することにより、そのようなユーザー定義の実装の存在を見つけるために一連のスキャンを実行します。
例えば:
...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...
...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...