15.8. RESTEasy インターセプター
15.8.1. JAX-RS 呼び出しのインターセプト リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
概要
RESTEasy は JAX-RS 呼び出しをインターセプトし、インターセプターと呼ばれるリスナーのようなオブジェクトでそれらをルーティングできます。このトピックでは、4 種類のインターセプターについて説明します。
例15.3 MessageBodyReader/Writer インターセプター
MessageBodyReaderInterceptors と MessageBodyWriterInterceptors は、サーバー側またはクライアント側のいずれかで使用できます。それらには注釈が付けられています
@Provider、およびいずれか@ServerInterceptorまた@ClientInterceptorRESTEasy がそれらをインターセプターリストに追加するかどうかを認識できるようにします。
これらのインターセプターは、
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;
}