57.3. フェーズでのインターセプター配置の制限
概要
インターセプターをフェーズに配置すると、インターセプターが適切に機能できる程度に、その配置を十分に細かく制御できない場合があります。たとえば、SAAJ API を使用してメッセージの SOAP ヘッダーを検査するのに必要なインターセプターは、メッセージを SAAJ オブジェクトに変換するインターセプターの後に実行する必要があります。また、別のインターセプターに必要なメッセージの一部が、他のインターセプターにより消費される場合もあります。この場合、開発者はインターセプターよりも前に実行する必要があるインターセプターのリストを指定できます。開発者はインターセプターの後に実行する必要があるインターセプターのリストを指定することもできます。
ランタイムでは、インターセプターのフェーズ内でのみ、このリストは受け入れられます。開発者が、現在のフェーズの後に実行する必要があるインターセプターのリストに前のフェーズのインターセプターを配置した場合には、ランタイムはその要求を無視します。
チェーンの事前追加
インターセプターの開発時に発生する問題の 1 つは、インターセプターが必要とするデータが常に存在するとは限らないことです。これは、チェーン内の 1 つのインターセプターが、後のインターセプターで必要となるメッセージデータを消費する場合に発生する可能性があります。開発者は、カスタムインターセプターの消費内容を制御し、インターセプターを変更して問題を修正できます。ただし、Apache CXF では多数のインターセプターが使用されており、開発者はそれらを変更できないため、これが常に可能であるとは限りません。
別の解決策として、カスタムインターセプターが必要とするメッセージデータを消費するインターセプターの前にカスタムインターセプターが配置されるようにすることです。これを行う最も簡単な方法は、初期のフェーズに配置することですが、それが常に可能であるとは限りません。あるインターセプターを 1 つ以上の他のインターセプターの前に配置する必要がある場合、Apache CXF の AbstractPhaseInterceptor
クラスは 2 つの addBefore()
メソッドを提供します。
例57.2「他のインターセプターの前にインターセプターを追加するメソッド」 のように、1 つは単一のインターセプター ID を取り、もう 1 つはインターセプター ID のコレクションを取ります。複数の呼び出しを実行して、リストへのインターセプターの追加を継続できます。
例57.2 他のインターセプターの前にインターセプターを追加するメソッド
publicaddBefore
String
i
publicaddBefore
Collection<String>
i
例57.3「現在のインターセプターの後に実行する必要があるインターセプターのリストの指定」 にあるように、開発者はカスタムインターセプターのコンストラクターで addBefore()
メソッドを呼び出します。
例57.3 現在のインターセプターの後に実行する必要があるインターセプターのリストの指定
public class MyPhasedOutInterceptor extends AbstractPhaseInterceptor
{
public MyPhasedOutInterceptor() {
super(Phase.PRE_LOGICAL);
addBefore(HolderOutInterceptor.class.getName());
}
...
}
ほとんどのインターセプターは、インターセプター ID にクラス名を使用します。
チェーンの事後追加
インターセプターに必要なデータが存在しないもう 1 つの理由は、データがメッセージオブジェクトに配置されていないことです。たとえば、インターセプターはメッセージデータを SOAP メッセージとして処理する場合がありますが、メッセージが SOAP メッセージに変換される前にチェーンに配置されている場合は機能しません。開発者は、カスタムインターセプターの消費内容を制御し、インターセプターを変更して問題を修正できます。ただし、Apache CXF では多数のインターセプターが使用されており、開発者はそれらを変更できないため、これが常に可能であるとは限りません。
別の解決策として、カスタムインターセプターが必要とするメッセージデータを消費するインターセプターの後にカスタムインターセプターが配置されるようにすることです。これを行う最も簡単な方法は、後のフェーズに配置することですが、それが常に可能であるとは限りません。AbstractPhaseInterceptor
クラスは、他のインターセプターの後にインターセプターを配置する必要がある場合に 2 つの addAfter()
メソッドを提供します。
例57.4「他のインターセプターの後にインターセプターを追加するメソッド」 のように、1 つのメソッドが単一のインターセプター ID を取り、もう 1 つのメソッドはインターセプター ID のコレクションを取ります。複数の呼び出しを実行して、リストへのインターセプターの追加を継続できます。
例57.4 他のインターセプターの後にインターセプターを追加するメソッド
publicaddAfter
String
i
publicaddAfter
Collection<String>
i
例57.5「現在のインターセプターの前に実行する必要があるインターセプターのリストの指定」 にあるように、開発者はカスタムインターセプターのコンストラクターで addAfter()
メソッドを呼び出します。
例57.5 現在のインターセプターの前に実行する必要があるインターセプターのリストの指定
public class MyPhasedOutInterceptor extends AbstractPhaseInterceptor
{
public MyPhasedOutInterceptor() {
super(Phase.PRE_LOGICAL);
addAfter(StartingOutInterceptor.class.getName());
}
...
}
ほとんどのインターセプターは、インターセプター ID にクラス名を使用します。