私はJAX-RSを初めて使用し、@Context
アノテーションは機能するはずです。
javadoc には、6つのクラスのリストがあります(Application
、UriInfo
、Request
、HttpHeaders
、SecurityContext
、Providers
)。ただし、次のように、この注釈を他のタイプで使用するコードをWeb上で見つけます。
@GET
public String something(@Context HttpServletRequest req) {
}
この注釈で使用できるサポートされているタイプのリストはありますか?このリストは、標準の実装ごとに変わりますか?
現在、Jerseyを実験していますが、他のJAX-RS実装に移植できないコードを書くのではないかと心配しています。
リベット留めJAX-RS specification は、@Context
を介して注入できるすべての標準タイプを定義します。
しかし、私があなたなら、選択したプロバイダーの特定のドキュメントを参照して、利用可能なものを確認するだけです。
たとえば、RESTEasyは@Context
を介して これらの値 を提供します。一方、Jerseyは これら を提供します。明らかに、標準のコンテキスト値のために重複があります。
@Context
アノテーションを使用すると、リクエスト/レスポンスコンテキストの詳細をJAX-RSプロバイダーおよびリソースクラスに注入できます。インジェクションは、クラスフィールド、Beanプロパティ、またはメソッドパラメータに実行できます。
次のリストは、 @Context
アノテーションを使用して挿入できるすべてのタイプを、 JAX-RS 2.0仕様 に従って要約しています。
javax.ws.rs.core.Application
javax.ws.rs.core.HttpHeaders
javax.ws.rs.core.Request
javax.ws.rs.core.SecurityContext
javax.ws.rs.core.UriInfo
javax.ws.rs.core.Configuration
javax.ws.rs.container.ResourceContext
javax.ws.rs.ext.Providers
Configuration
および Providers
を除きます。これらはクライアントとサーバー側の両方のプロバイダーで注入可能で、他のすべてのタイプはサーバー側のみ。
次のタイプが利用可能ですonlyアプリケーションがサーブレットコンテナにデプロイされている場合:
javax.servlet.HttpServletRequest
javax.servlet.HttpServletResponse
javax.servlet.ServletConfig
javax.servlet.ServletContext
JAX-RS 2.1@Context
で挿入できる他のタイプが導入されました:
上記の標準タイプに加えて、 Jersey 、 RESTEasy 、および 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
は実際に削除されます。
@Contextアノテーションを使用して、12個のオブジェクトを注入できます。ここにそれぞれの簡単な要約があります
これらのインスタンスはすべて、リソースメソッドに挿入できます。
@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は何に使用されますか