57.2. インターセプターのフェーズの指定
概要
インターセプターはフェーズ別に編成されます。インターセプターのフェーズは、呼び出されるメッセージ処理シーケンスのタイミングを決定します。開発者は、インターセプターのフェーズとそのコンストラクターを指定します。フェーズは、フレームワークによって提供される定数値を使用して指定されます。
フェーズ
フェーズはインターセプターの論理コレクションです。図57.1「インターセプターフェーズ」 で示されているように、フェーズ内のインターセプターは順次呼び出されます。
図57.1 インターセプターフェーズ
フェーズは順序付けされたリストでリンクされ、インターセプターチェーンを形成すると共に、メッセージ処理手順で定義された論理ステップを提供します。たとえば、インバウンドインターセプターチェーンの RECEIVE
フェーズにあるインターセプターのグループは、ネットワークから取得した RAW メッセージデータを使用してトランスポートレベルの詳細を処理します。
ただしどのフェーズでも、作業内容を強制的に実行することはできません。フェーズ内のインターセプターは、フェーズに含まれるタスクに準拠することが推奨されます。
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 フェーズに配置されます。