61.6. エンティティーリーダーインターセプター
概要 リンクのコピーリンクがクリップボードにコピーされました!
本セクションでは、エンティティーリーダーインターセプター を実装し、登録する方法を説明します。これにより、クライアント側またはサーバー側でメッセージボディーを読み取る際に入力ストリームをインターセプトできます。これは通常、暗号化や復号などの要求ボディーの汎用的な変換や圧縮や圧縮解除に役立ちます。
ReaderInterceptor インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
javax.ws.rs.ext.ReaderInterceptor インターフェイスは以下のように定義されます。
ReaderInterceptor インターフェイスを実装することで、メッセージボディー (Entity オブジェクト) をサーバー側またはクライアント側で読み取る際にインターセプトできます。エンティティーリーダーインターセプターは、以下のいずれかのコンテキストで使用できます。
- サーバー側: サーバー側のインターセプターとしてバインドされた場合に、エンティティーリーダーインターセプターは、(一致したリソース内の) アプリケーションコードによってアクセスされたタイミングで、要求メッセージのボディーをインターセプトします。REST 要求のセマンティクスによっては、一致したリソースがメッセージ本文にアクセスできない場合があり、そのような場合にはリーダーインターセプターは呼び出されません。
-
クライアント側: クライアント側のインターセプターとしてバインドされた場合に、エンティティーリーダーインターセプターは、クライアントコードによってアクセスされたタイミングで応答メッセージのボディーをインターセプトします。クライアントコードが明示的にレスポンスメッセージにアクセスしない場合 (
Response.getEntityメソッドの呼び出しなど)、リーダーインターセプターは呼び出されません。
ReaderInterceptorContext インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
ReaderInterceptor の aroundReadFrom メソッドは、メッセージボディー (Entity オブジェクト) とメッセージメタデータの両方にアクセスするために使用できる javax.ws.rs.ext.ReaderInterceptorContext 型の引数を 1 つ受け取ります。
ReaderInterceptorContext インターフェイスは以下のように定義されます。
InterceptorContext インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
ReaderInterceptorContext インターフェイスは、ベース InterceptorContext インターフェイスから継承されたメソッドもサポートします。
InterceptorContext インターフェイスは以下のように定義されます。
クライアント側での実装例 リンクのコピーリンクがクリップボードにコピーされました!
クライアント側にエンティティーリーダーインターセプターを実装するには、ReaderInterceptor インターフェイスを実装するクラスを定義します。
たとえば、以下のコードは、クライアント側のエンティティーリーダーインターセプター (優先度が 10) の例を示しています。これは、受信応答のメッセージボディーで COMPANY_NAME の全インスタンスを Red Hat に置き換えます。
サーバー側での実装例 リンクのコピーリンクがクリップボードにコピーされました!
サーバー側のエンティティーリーダーインターセプターを実装するには、ReaderInterceptor インターフェイスを実装し、@Provider アノテーションを付けるクラスを定義します。
たとえば、以下のコードは、サーバー側のエンティティーリーダーインターセプター (優先度が 10) の例を示しています。これは、受信リクエストのメッセージボディーで COMPANY_NAME の全インスタンスを Red Hat に置き換えます。
クライアント側でのリーダーインターセプターのバインド リンクのコピーリンクがクリップボードにコピーされました!
JAX-RS 2.0 クライアント API を使用すると、エンティティーリーダーインターセプターを javax.ws.rs.client.Client オブジェクトまたは javax.ws.rs.client.WebTarget オブジェクトに直接登録できます。実質的に、リーダーインターセプターはオプションで異なるスコープに適用できるため、インターセプターの影響を受けるのは、特定の URI パスのみです。
たとえば、以下のコードは、client オブジェクトを使用して実行されたすべての呼び出しに適用されるように SampleClientReaderInterceptor インターセプターを登録する方法を示しています。
JAX-RS 2.0 クライアントでインターセプターを登録する方法は、「クライアントエンドポイントの設定」 を参照してください。
サーバー側でのリーダーインターセプターのバインド リンクのコピーリンクがクリップボードにコピーされました!
サーバー側でリーダーインターセプターを バインド する (つまり Apache CXF ランタイムにインストールする) には、以下の手順を実行します。
以下のコードフラグメントで示されるように、
@Providerアノテーションをリーダーインターセプタークラスに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow リーダーインターセプター実装が Apache CXF ランタイムにロードされると、REST 実装はロードされたクラスを自動的にスキャンし、
@Providerアノテーション (スキャンフェーズ) の付いたクラスを検索します。XML で JAX-RS サーバーエンドポイントを定義する場合 (例: 「JAX-RS サーバーエンドポイントの設定」)、
jaxrs:providers要素のプロバイダーリストにリーダーインターセプターを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記この手順は、Apache CXF の非標準要件です。厳密に言うと、JAX-RS 標準によれば、インターセプターをバインドするために必要なのは
@Providerアノテーションのみです。しかし実際には、標準的なアプローチはやや柔軟性がなく、大規模なプロジェクトに多くのライブラリーが含まれている場合は、プロバイダーの衝突につながる可能性があります。