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 で作成し、オーバーライドするインターセプターがあります。また、これらのインターセプターを使用すると、ヘッダーを応答またはクライアント側の送信リクエストに追加できます。
public interface MessageBodyReaderInterceptor
  {
     Object read(MessageBodyReaderContext context) throws IOException, WebApplicationException;

  }

public interface MessageBodyWriterInterceptor
  {
     void write(MessageBodyWriterContext context) throws IOException, WebApplicationException;

  }
Copy to Clipboard Toggle word wrap
インターセプターと MessageBodyReader または Writer は、大きな Java 呼び出しスタックで呼び出されます。次のインターセプターに移動するには、MessageBodyReaderContext.proceed() あるいは MessageBodyWriterContext.proceed() が呼び出されます。呼び出すインターセプターがなくなると、MessageBodyReader または MessageBodyWriter の readFrom()writeTo() が呼び出されます。このラッピングにより、オブジェクトが 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();
    }
}
Copy to Clipboard Toggle word wrap

例12.4 PreProcessInterceptor

PreProcessInterceptors は、呼び出しを行う JAX-RS リソースメソッドが見つかった後、実際の呼び出しが行われる前に実行されます。@ServerInterceptor アノテーションが付けられ、順番に実行されます。
これらのインターフェースはサーバー上でのみ使用可能です。これらのインターフェースを使用すると、セキュリティー機能の実装または Java リクエストの処理が行えます。RESTEasy のセキュリティー実装はこのタイプのインターセプターを使用して、ユーザーが承認されなかった場合にリクエストが発生する前にリクエストをアボートします。また、RESTEasy のキャッシュフレームワークもこれを使用してキャッシュされた応答を返し、再度メソッドが呼び出されないようにします。
public interface PreProcessInterceptor
    {
       ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
    }
Copy to Clipboard Toggle word wrap
preProcess() メソッドが ServerResponse を返すと、基礎となる JAX-RS メソッドは呼び出されず、ランタイムが応答を処理してクライアントに返します。preProcess() メソッドが ServerResponse を返さない場合は、基礎となる JAX-RS メソッドが呼び出されます。

例12.5 PostProcessInterceptors

PostProcessInterceptors は、JAX-RS メソッドが呼び出された後、MessageBodyWriters が呼び出される前に実行されます。MessageBodyWriter が呼び出されない可能性があり、応答ヘッダーを設定する必要がある場合に使用されます。
サーバー側でのみ利用可能です。何もラップしませんが、順番に呼び出されます。
public interface PostProcessInterceptor
  {
    void postProcess(ServerResponse response);
  }
Copy to Clipboard Toggle word wrap

例12.6 ClientExecutionInterceptors

ClientExecutionInterceptors はクライアント側でのみ使用可能です。サーバーに送られる HTTP 呼び出しをラップします。@ClientInterceptor および @Provider アノテーションを付ける必要があります。これらのインターセプターは、MessageBodyWriter の後、ClientRequest がクライアント側でビルドされた後に実行されます。
RESTEasy GZIP サポートは ClientExecutionInterceptors を使用し、リクエストが送信される前に Accept ヘッダーに「gzip, deflate」が含まれるように設定します。RESTEasy のクライアントキャッシュはこれを使い、送信される前にキャッシュにリソースが含まれているかどうかを確認します。
public interface ClientExecutionInterceptor
{
  ClientResponse execute(ClientExecutionContext ctx) throws Exception;
}

public interface ClientExecutionContext
{
  ClientRequest getRequest();

  ClientResponse proceed() throws Exception;
}
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat