第28章 インターセプタ
RESTEasy は JAX-RS 呼び出しを傍受し、インターセプタ と呼ばれるリスナと似たオブジェクトを介してルーティングすることができます。 サーバー側には 4 つの傍受ポイントがあります。
MessageBodyWriter呼び出しのラッピングMessageBodyReader呼び出しのラッピング- アンマーシャリングの前に受信要求を傍受する プリプロセッサ を経由
- JAX-RS メソッドの終了直後に呼び出される ポストプロセッサ を経由
MessageBodyReader や MessageBodyWriter、 クライアント側でのサーバーへのリモート呼び出しを傍受することもできます。
28.1. MessageBodyReader/Writer インターセプタ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
MessageBodyReader インターセプタと MessageBodyWriter インターセプタは、 MessageBodyReader.readFrom() や MessageBodyWriter.writeTo() の呼び出しをラッピングします。 これらは Output や InputStream をラッピングするために使用されます。 例えば、 GZIP エンコーディングが動作するよう、 RESTEasy の GZIP サポートには GzipOutputStream や GzipInputStream を用いてデフォルトの Output と InputStream を作成しオーバーライドするインターセプタが含まれています。 応答 (クライアント側では送信要求) にヘッダを追加するためインターセプタを使用することもできます。
インターセプタを使用するには、
org.jbos.resteasy.spi.interception.MessageBodyReaderInterceptor か MessageBodyWriterInterceptor を実装します。
インターセプタは
MessageBodyWriterContext や MessageBodyReaderContext によって操作されます。 インターセプタは Java コールスタックで一緒に呼び出されます。 後続のインターセプタを追加するには、 MessageBodyReaderContext.proceed() または MessageBodyWriterContext.proceed() を呼び出す必要があります。 呼び出すインターセプタがなくなったら、 MessageBodyReader または MessageBodyWriter の readFrom() か writeTo() メソッドを呼び出します。 このラッピングにより、 リーダーやライターに達する前にオブジェクトを変更でき、 proceed() が返信する時にクリーンアップを行うことができます。 Context オブジェクトは、 リーダーやライターに送信されたパラメータを変更するメソッドも持っています。
MessageBodyReaderInterceptor と MessageBodyWriterInterceptor はサーバー側かクライアント側で使用することができます。 RESTeasy によって正しいインターセプタリストに追加されるよう、 @org.jboss.resteasy.annotations.interception.ServerInterceptor または @org.jboss.resteasy.annotations.interception.ClientInterceptor アノテーションを付けなければなりません。 これらのアノテーションの両方かいずれかがインターセプタクラスに付けられていないと、 デプロイメントエラーが発生します。 また、 インターセプタは次のように @Provider アノテーションが付けられていなければなりません。
これは、 応答にヘッダ値を追加するサーバー側のインターセプタになります。
@Provider と @ServerInterceptor アノテーションが付けられています。 MessageBodyReader の実行後に応答がコミットされるため、 context.proceed() を呼び出す前にヘッダを変更する必要があります。
重要
context.proceed() を呼び出さないと呼び出しができません。