15.8. RESTEasy インターセプター
15.8.1. JAX-RS 呼び出しのインターセプト
概要
RESTEasy は JAX-RS 呼び出しをインターセプトし、インターセプターと呼ばれるリスナーのようなオブジェクトでそれらをルーティングできます。このトピックでは、4 種類のインターセプターについて説明します。
例15.3 MessageBodyReader/Writer インターセプター
MessageBodyReaderInterceptors と MessageBodyWriterInterceptors は、サーバー側またはクライアント側のいずれかで使用できます。それらには注釈が付けられています
@Provider
、およびいずれか@ServerInterceptor
また@ClientInterceptor
RESTEasy がそれらをインターセプターリストに追加するかどうかを認識できるようにします。
これらのインターセプターは、
MessageBodyReader.readFrom()
またMessageBodyWriter.writeTo()
。これらは、Output や Input ストリームをラップするために使用できます。
RESTEasy GZIP サポートには、デフォルトの出力ストリームと入力ストリームを作成して GzipOutputStream または GzipInputStream でオーバーライドするインターセプターがあり、gzip エンコードが機能します。また、クライアント側で応答または送信要求にヘッダーを追加するために使用することもできます。
public interface MessageBodyReaderInterceptor { Object read(MessageBodyReaderContext context) throws IOException, WebApplicationException; } public interface MessageBodyWriterInterceptor { void write(MessageBodyWriterContext context) throws IOException, WebApplicationException; }
インターセプターと MessageBodyReader または Writer は、単一の大きな Java 呼び出しスタックで呼び出されます。
MessageBodyReaderContext.proceed()
またMessageBodyWriterContext.proceed()
次のインターセプターに移動するために呼び出されます。呼び出すインターセプターがこれ以上ない場合は、readFrom()
またwriteTo()
MessageBodyReader または MessageBodyWriter のメソッド。このラッピングにより、オブジェクトは Reader や Writer に到達する前に変更でき、proceed()
が返された後にクリーンアップされます。
以下の例は、ヘッダー値を応答に追加するサーバー側のインターセプターです。
@Provider @ServerInterceptor public class MyHeaderDecorator implements MessageBodyWriterInterceptor { public void write(MessageBodyWriterContext context) throws IOException, WebApplicationException { context.getHeaders().add("My-Header", "custom"); context.proceed(); } }
例15.4 PreProcessInterceptor
PreProcessInterceptors は、JAX-RS リソースメソッドが呼び出されることが検出された後、実際の呼び出しが行われる前に実行されます。それらは @ServerInterceptor でアノテーションが付けられ、順番に実行されます。
これらのインターフェイスはサーバー上でのみ使用できます。これらは、セキュリティー機能を実装したり、Java 要求を処理したりするために使用できます。RESTEasy セキュリティーの実装では、このタイプのインターセプターを使用して、ユーザーが承認を渡さない場合に、要求が発生する前に要求を中止します。RESTEasy キャッシングフレームワークもこれを使用して、キャッシュされた応答を返し、メソッドが再度呼び出されないようにします。
public interface PreProcessInterceptor { ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException; }
の場合
preProcess()
メソッドが ServerResponse を返すと、基になる JAX-RS メソッドは呼び出されず、ランタイムは応答を処理してクライアントに戻ります。の場合preProcess()
メソッドは ServerResponse を返さず、基礎となる JAX-RS メソッドが呼び出されます。
例15.5 PostProcessInterceptors
PostProcessInterceptors は、JAX-RS メソッドが呼び出された後、MessageBodyWriters が呼び出される前に実行されます。これらは、MessageBodyWriter が呼び出されない可能性があるときに応答ヘッダーを設定する必要がある場合に使用されます。
サーバー側でのみ使用できます。それらは何もラップせず、順番に呼び出されます。
public interface PostProcessInterceptor { void postProcess(ServerResponse response); }
例15.6 ClientExecutionInterceptors
ClientExecutionInterceptors は、クライアント側でのみ使用できます。これらは、サーバーに送信される HTTP 呼び出しをラップアラウンドします。それらには注釈を付ける必要があります
@ClientInterceptor
と@Provider
。これらのインターセプターは、MessageBodyWriter の後、および ClientRequest がクライアント側で構築された後に実行されます。
RESTEasy GZIP サポートは、ClientExecutionInterceptors を使用して、リクエストが送信される前に gzip、deflate を含むように Accept ヘッダーを設定します。RESTEasy クライアントキャッシュは、それを使用して、ネットワークを経由する前に、キャッシュにリソースが含まれているかどうかを確認します。
public interface ClientExecutionInterceptor { ClientResponse execute(ClientExecutionContext ctx) throws Exception; } public interface ClientExecutionContext { ClientRequest getRequest(); ClientResponse proceed() throws Exception; }