57.2. インターセプターのフェーズの指定

概要

インターセプターはフェーズ別に編成されます。インターセプターのフェーズは、呼び出されるメッセージ処理シーケンスのタイミングを決定します。開発者は、インターセプターのフェーズとそのコンストラクターを指定します。フェーズは、フレームワークによって提供される定数値を使用して指定されます。

フェーズ

フェーズはインターセプターの論理コレクションです。図57.1「インターセプターフェーズ」 で示されているように、フェーズ内のインターセプターは順次呼び出されます。

図57.1 インターセプターフェーズ

インターセプターはフェーズにリンクされます。

フェーズは順序付けされたリストでリンクされ、インターセプターチェーンを形成すると共に、メッセージ処理手順で定義された論理ステップを提供します。たとえば、インバウンドインターセプターチェーンの RECEIVE フェーズにあるインターセプターのグループは、ネットワークから取得した生のメッセージデータを使用してトランスポートレベルの詳細を処理します。

ただしどのフェーズでも、作業内容を強制的に実行することはできません。フェーズ内のインターセプターは、フェーズに含まれるタスクに準拠することが推奨されます。

Apache CXF によって定義されるフェーズの完全なリストは、62章Apache CXF Message Processing フェーズ を参照してください。

フェーズの指定

Apache CXF は、フェーズの指定に使用する org.apache.cxf.Phase クラスを提供します。クラスは定数のコレクションです。Apache CXF によって定義される各フェーズの Phase クラスに対応する定数があります。たとえば、RECEIVE フェーズは Phase.RECEIVE 値によって指定されます。

フェーズの設定

インターセプターのフェーズは、インターセプターのコンストラクターに設定されます。AbstractPhaseInterceptor クラスは、インターセプターをインスタンス化するためのコンストラクターを 3 つ定義します。

  • public AbstractPhaseInterceptor(String phase) - インターセプターのフェーズを指定されたフェーズに設定し、インターセプターの ID をインターセプターのクラス名に自動的に設定します。

    このコンストラクターはほとんどのユースケースに対応します。

  • public AbstractPhaseInterceptor(String id, String phase) - インターセプターの ID を最初のパラメーターとして渡された文字列に設定し、インターセプターのフェーズを 2 番目の文字列に設定します。
  • public AbstractPhaseInterceptor(String phase, boolean uniqueId) - インターセプターが一意のシステム生成された ID を使用するかどうかを指定します。uniqueId パラメーターが true の場合、インターセプターの ID はシステムによって計算されます。uniqueId パラメーターが false の場合、インターセプターの ID はインターセプターのクラス名に設定されます。

カスタムインターセプターのフェーズの設定方法として、例57.1「インターセプターフェーズの設定」 のように super() メソッドを使用して AbstractPhaseInterceptor コンストラクターにフェーズを渡すことが推奨されます。

例57.1 インターセプターフェーズの設定

import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

public class StreamInterceptor extends AbstractPhaseInterceptor<Message>
 {

    public StreamInterceptor()
   {
     super(Phase.PRE_STREAM);
    }
}

例57.1「インターセプターフェーズの設定」 に示す StreamInterceptor インターセプターは、PRE_STREAM フェーズに配置されます。