Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

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;
}