12.9. RESTEasy インターセプター
12.9.1. JAX-RS 呼び出しのインターセプト リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasy は JAX-RS 呼び出しをインターセプトでき、インターセプターと呼ばれるリスナーのようなオブジェクトでルーティングを行います。このトピックでは、4 種類のインターセプターについて説明します。
例12.3 MessageBodyReader/Writer インターセプター
MessageBodyReaderInterceptors および MessageBodyWriterInterceptors は、クライアント側とサーバー側のいずれかに使用できます。これらをインターセプターリストに追加するかどうかを RESTEasy が認識できるようにするため、アノテーションとして
@Provider
と、@ServerInterceptor
と @ClientInterceptor
のいずれかが付けられます。
これらのインターセプターは、
MessageBodyReader.readFrom()
あるいは MessageBodyWriter.writeTo()
の呼び出しをラップします。また、出力または入力ストリームをラップするために使用できます。
RESTEasy GZIP サポートには、Gzip エンコーディングが機能できるよう、デフォルトの入出力ストリームを GzipOutputStream あるいは GzipInputStream で作成し、オーバーライドするインターセプターがあります。また、これらのインターセプターを使用すると、ヘッダーを応答またはクライアント側の送信リクエストに追加できます。
インターセプターと MessageBodyReader または Writer は、大きな Java 呼び出しスタックで呼び出されます。次のインターセプターに移動するには、
MessageBodyReaderContext.proceed()
あるいは MessageBodyWriterContext.proceed()
が呼び出されます。呼び出すインターセプターがなくなると、MessageBodyReader または MessageBodyWriter の readFrom()
か writeTo()
が呼び出されます。このラッピングにより、オブジェクトが Reader または Writer に到達する前にオブジェクトが変更され、proceed()
が返された後にクリーンアップされます。
以下の例は、ヘッダーの値を応答に追加するサーバー側のインターセプターになります。
例12.4 PreProcessInterceptor
PreProcessInterceptors は、呼び出しを行う JAX-RS リソースメソッドが見つかった後、実際の呼び出しが行われる前に実行されます。@ServerInterceptor アノテーションが付けられ、順番に実行されます。
これらのインターフェースはサーバー上でのみ使用可能です。これらのインターフェースを使用すると、セキュリティー機能の実装または Java リクエストの処理が行えます。RESTEasy のセキュリティー実装はこのタイプのインターセプターを使用して、ユーザーが承認されなかった場合にリクエストが発生する前にリクエストをアボートします。また、RESTEasy のキャッシュフレームワークもこれを使用してキャッシュされた応答を返し、再度メソッドが呼び出されないようにします。
public interface PreProcessInterceptor { ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException; }
public interface PreProcessInterceptor
{
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
}
preProcess()
メソッドが ServerResponse を返すと、基礎となる JAX-RS メソッドは呼び出されず、ランタイムが応答を処理してクライアントに返します。preProcess()
メソッドが ServerResponse を返さない場合は、基礎となる JAX-RS メソッドが呼び出されます。
例12.5 PostProcessInterceptors
PostProcessInterceptors は、JAX-RS メソッドが呼び出された後、MessageBodyWriters が呼び出される前に実行されます。MessageBodyWriter が呼び出されない可能性があり、応答ヘッダーを設定する必要がある場合に使用されます。
サーバー側でのみ利用可能です。何もラップしませんが、順番に呼び出されます。
public interface PostProcessInterceptor { void postProcess(ServerResponse response); }
public interface PostProcessInterceptor
{
void postProcess(ServerResponse response);
}
例12.6 ClientExecutionInterceptors
ClientExecutionInterceptors はクライアント側でのみ使用可能です。サーバーに送られる HTTP 呼び出しをラップします。
@ClientInterceptor
および @Provider
アノテーションを付ける必要があります。これらのインターセプターは、MessageBodyWriter の後、ClientRequest がクライアント側でビルドされた後に実行されます。
RESTEasy GZIP サポートは ClientExecutionInterceptors を使用し、リクエストが送信される前に Accept ヘッダーに「gzip, deflate」が含まれるように設定します。RESTEasy のクライアントキャッシュはこれを使い、送信される前にキャッシュにリソースが含まれているかどうかを確認します。