web-dev-qa-db-ja.com

@Contextアノテーションを使用してどのオブジェクトを注入できますか?

私はJAX-RSを初めて使用し、@Contextアノテーションは機能するはずです。

javadoc には、6つのクラスのリストがあります(ApplicationUriInfoRequestHttpHeadersSecurityContextProviders)。ただし、次のように、この注釈を他のタイプで使用するコードをWeb上で見つけます。

@GET
public String something(@Context HttpServletRequest req) {

}

この注釈で使用できるサポートされているタイプのリストはありますか?このリストは、標準の実装ごとに変わりますか?

現在、Jerseyを実験していますが、他のJAX-RS実装に移植できないコードを書くのではないかと心配しています。

25
idrosid

リベット留めJAX-RS specification は、@Contextを介して注入できるすべての標準タイプを定義します。

しかし、私があなたなら、選択したプロバイダーの特定のドキュメントを参照して、利用可能なものを確認するだけです。

たとえば、RESTEasyは@Contextを介して これらの値 を提供します。一方、Jerseyは これら を提供します。明らかに、標準のコンテキスト値のために重複があります。

19
Vidya

@Context アノテーションを使用すると、リクエスト/レスポンスコンテキストの詳細をJAX-RSプロバイダーおよびリソースクラスに注入できます。インジェクションは、クラスフィールドBeanプロパティ、またはメソッドパラメータに実行できます。


次のリストは、 @Context アノテーションを使用して挿入できるすべてのタイプを、 JAX-RS 2.0仕様 に従って要約しています。

Configuration および Providers を除きます。これらはクライアントとサーバー側の両方のプロバイダーで注入可能で、他のすべてのタイプはサーバー側のみ

次のタイプが利用可能ですonlyアプリケーションがサーブレットコンテナにデプロイされている場合:

JAX-RS 2.1@Context で挿入できる他のタイプが導入されました:

上記の標準タイプに加えて、 JerseyRESTEasy 、および Apache CXF などのJAX-RS実装は、 @Context を使用して挿入されます。


インジェクションに使用可能な各JAX-RSタイプの簡単な説明を以下に示します。

  • Application:アプリケーションが提供する Application サブクラスのインスタンスは、クラスフィールドまたはメソッドに挿入できます。パラメータ。 Application サブクラスインスタンスにアクセスすると、構成情報をそのクラスに集中化できます。

  • URIおよびURIテンプレート:UriInfo は、コンポーネントに関する静的および動的なリクエストごとの情報を提供しますリクエストURIの。

  • Headers:HttpHeaders は、マップ形式または厳密に型指定された便利なメソッドを介して要求ヘッダー情報へのアクセスを提供します。応答ヘッダーは Response クラスを使用して提供できます。

  • コンテンツのネゴシエーションと前提条件:Request のメソッドにより、呼び出し元は最適な表現バリアントを決定でき、リソースの現在の状態がリクエストのいずれかの前提条件と一致するかどうかを評価します。

  • セキュリティコンテキスト:SecurityContext インターフェイスは、現在のリクエストのセキュリティコンテキストに関する情報へのアクセスを提供します。 SecurityContext のメソッドは、現在のユーザープリンシパルへのアクセス、リクエスターが引き受けるロールに関する情報、リクエストがセキュアチャネル経由で到着したかどうか、および使用される認証スキームを提供します。

  • Providers:Providers インターフェイスを使用すると、一連の検索条件に基づいてプロバイダーインスタンスを検索できます。このインターフェイスは、他のプロバイダーの機能を使用したいプロバイダーの作成者が主に関心を持つと期待されています。クライアントとサーバーの両方のプロバイダーで注入可能です。

  • リソースコンテキスト:ResourceContext インターフェースは、デフォルトでリソースまたはサブリソースクラスのインスタンス化と初期化へのアクセスを提供しますリクエストごとのスコープ。アプリケーションによって作成されたインスタンスの作成と初期化、または単に初期化を支援するために注入できます。

  • 構成:クライアントとサーバーランタイムの両方 Configuration sはプロバイダー(クライアントまたはサーバー)およびリソースクラス(サーバーのみ)。

  • SSEイベント:SseEventSink は、着信SSE接続を表し、提供しますイベントを送信するためのメソッド Sse は、イベントおよびブロードキャスター用のファクトリメソッドを提供します。


これは post によって書かれた Arjan Tijms はJAX-RSの将来のバージョンを示唆していますmay have CDIとのより強力な統合。 @Context は非推奨となり、 @Inject に置き換えて削除できます。

JAX-RS 2.2

何らかの理由で、時間の大部分が失われてしまったため、JAX-RSは、CDIの@Contextの代わりに@Injectに基づいた独自の依存性注入システムを使用します。 JAX-RSは最初のリリースの直前にCDIをある程度サポートするために更新されましたが、JAX-RSリソースがCDI Beanではないという事実により、仕様が不必要に抑制され、JAX-RSがEE 6(2009)で導入されました。

CDIへのこの切り替えは、2つのステップで行われる可能性があります。 JAX-RS 2.2では、@Contextでインジェクトでき​​るものはすべて@Injectを使用してインジェクト可能である必要があり、JAX-RSリソースはデフォルトでCDI Beanになります(明示的に無効にしない限り)。同時に@Contextは廃止されます。 JAX-RS 3.0では、@Contextは実際に削除されます。

42
cassiomolin

@Contextアノテーションを使用して、12個のオブジェクトを注入できます。ここにそれぞれの簡単な要約があります

  • HttpHeaders-HTTPヘッダーの値とパラメーター
  • UriInfo-URIクエリパラメーターとパス変数
  • SecurityContext-指定されたHTTPリクエストのセキュリティ関連データへのアクセスを提供します
  • 要求-前提条件の要求処理を許可します
  • ServletConfig-ServletConfig
  • ServletContext-ServletContext
  • HttpServletRequest-リクエストのHttpServletRequestインスタンス
  • HttpServletResponse-HttpServletResponseインスタンス
  • アプリケーション、構成、およびプロバイダー-> JAX-RSアプリケーション、構成、およびプロバイダーに関する情報を提供する
  • ResourceContext-リソースクラスインスタンスへのアクセスを提供します

これらのインスタンスはすべて、リソースメソッドに挿入できます。

@Path("/")
public class EndpointResource {

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response getAllHttpHeaders(final @Context HttpHeaders httpHeaders){
      // Code here that uses httpHeaders
  }
}

またはフィールドとして:

@Path("/")
public class EndpointResource {

  private final @Context HttpHeaders httpHeaders;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response getAllHttpHeaders(){
      // Code here that uses httpHeaders
  }
}

質問に答える5つのパートのシリーズがあります @ Conextは何に使用されますか

4
Alex Theedom