28.7. インターセプタの順番と優先度
インターセプタによっては呼び出される順番の考慮が必要なものもあります。 例えば、 セキュリティインターセプタは常に最初に呼び出されなければなりません。 他のインターセプタの動作は、 ヘッダを追加するインターセプタが起因となることがあります。 デフォルトでは、 登録されたインターセプタの呼び出し順序をユーザーが制御することはできませんが、 インターセプタの 優先度 を指定することはできます。
インターセプタの優先度はインターセプタクラスを一覧表示することで指定されません。
@org.jboss.resteasy.annotations.interception.Precedence アノテーションによって特定のインターセプタクラスが 優先度ファミリ に関連付けされます。 ファミリ構造で優先度を指定すると、 順番に影響する内蔵インターセプタを保護できるため、 設定を簡略化することができます。
以下は実行順にリストされたファミリです。
優先度ファミリに関連付けされていないインターセプタは最後に呼び出されます。 通常、
SECURITY には PreProcessInterceptor が含まれます。 認証前の発生を最小限にするため、 これらのインターセプタを最初に呼び出す必要があります。 HEADER_DECORATOR は、 応答や発信要求にヘッダを追加するインターセプタです。追加されたヘッダが他のインターセプタの動作に影響することがあるため、 これらのインターセプタの優先度は 2 番目になります。 ENCODER インターセプタは OutputStream を変更します。 例えば、 GZIP インターセプタは GZIPOutputStream を作成し、 圧縮のため実際の OutputStream をラッピングします。 REDIRECT インターセプタは要求を再ルーティングし、 JAX-RS メソッドを迂回するため、 通常 PreProcessInterceptor で使用されます。 DECODER インターセプタは InputStream をラッピングします。 例えば、 GZIP インターセプタデコーダは GzipInputStream インスタンスの InputStream をラッピングします。
特定のファミリへカスタムインターセプタを関連付けるには、
@org.jboss.resteasy.annotations.interception.Precendence annotation アノテーションを付けます。
org.jboss.resteasy.annotations.interception パッケージには、 完全にタイプを安全化する便利なアノテーション @DecoredPrecedence、 @EncoderPrecedence、 @HeaderDecoratorPrecedence、 @RedirectPrecedence、 @SecurityPrecedence があります。 これらのアノテーションは @Precedence の代わりに使用します。
28.7.1. カスタム優先度 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
独自の優先度ファミリを定義し、
@Precedence アノテーションで適用することができます。
@Provider
@ServerInterceptor
@Precedence("MY_CUSTOM_PRECEDENCE")
public class MyCustomInterceptor implements MessageBodyWriterInterceptor {...}
@Provider
@ServerInterceptor
@Precedence("MY_CUSTOM_PRECEDENCE")
public class MyCustomInterceptor implements MessageBodyWriterInterceptor {...}
独自の便利なアノテーションを作成するには、 メタアノテーションとして
@Precedence を使用します。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Precedence("MY_CUSTOM_PRECEDENCE")
public @interface MyCustomPrecedence {}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Precedence("MY_CUSTOM_PRECEDENCE")
public @interface MyCustomPrecedence {}
デプロイメント時に RESTEasy がエラーを表示するため、 カスタム優先度は登録するようにしてください。 次のように、 コンテキストパラメータを用いてカスタム優先度を登録することができます。
resteasy.append.interceptor.precedence resteasy.interceptor.before.precedence resteasy.interceptor.after.precedence
resteasy.append.interceptor.precedence
resteasy.interceptor.before.precedence
resteasy.interceptor.after.precedence
resteasy.append.interceptor.precedence は優先度ファミリをこのリストに追加します。 resteasy.interceptor.before.precedence は優先度の前となるファミリを指定できるようにします。 resteasy.interceptor.after.precedence は優先度の後となるファミリを指定できるようにします。 例は次の通りです。
この
web.xml ファイルでは 、END と BEFORE_ENCODER、 AFTER_ENCODER の 3 つの新しい優先度ファミリが定義されました。 この設定では、 ファミリの順番は次のようになります。