57.3. フェーズでのインターセプター配置の制限

概要

インターセプターをフェーズに配置すると、インターセプターが適切に機能できる程度に、その配置を十分に細かく制御できない場合があります。たとえば、SAAJ API を使用してメッセージの SOAP ヘッダーを検査するのに必要なインターセプターは、メッセージを SAAJ オブジェクトに変換するインターセプターの後に実行する必要があります。また、別のインターセプターに必要なメッセージの一部が、他のインターセプターにより消費される場合もあります。この場合、開発者はインターセプターよりも前に実行する必要があるインターセプターの一覧を指定できます。開発者はインターセプターの後に実行する必要があるインターセプターの一覧を指定することもできます。

重要

ランタイムでは、インターセプターのフェーズ内でのみ、このリストは受け入れられます。開発者が、現在のフェーズの後に実行する必要があるインターセプターのリストに前のフェーズのインターセプターを配置した場合には、ランタイムはその要求を無視します。

チェーンの事前追加

インターセプターの開発時に発生する問題の 1 つは、インターセプターが必要とするデータが常に存在するとは限らないことです。これは、チェーン内の 1 つのインターセプターが、後のインターセプターで必要となるメッセージデータを消費する場合に発生する可能性があります。開発者は、カスタムインターセプターの消費内容を制御し、インターセプターを変更して問題を修正できます。ただし、Apache CXF では多数のインターセプターが使用されており、開発者はそれらを変更できないため、これが常に可能であるとは限りません。

別の解決策として、カスタムインターセプターが必要とするメッセージデータを消費するインターセプターの前にカスタムインターセプターが配置されるようにすることです。これを行う最も簡単な方法は、初期のフェーズに配置することですが、それが常に可能であるとは限りません。あるインターセプターを 1 つ以上の他のインターセプターの前に配置する必要がある場合、Apache CXF の AbstractPhaseInterceptor クラスは 2 つの addBefore() メソッドを提供します。

例57.2「他のインターセプターの前にインターセプターを追加するメソッド」 のように、1 つは単一のインターセプター ID を取り、もう 1 つはインターセプター ID のコレクションを取ります。複数の呼び出しを実行して、リストへのインターセプターの追加を継続できます。

例57.2 他のインターセプターの前にインターセプターを追加するメソッド

publicaddBeforeStringipublicaddBeforeCollection<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 他のインターセプターの後にインターセプターを追加するメソッド

publicaddAfterStringipublicaddAfterCollection<String>i

例57.5「現在のインターセプターの前に実行する必要があるインターセプターの一覧の指定」 にあるように、開発者はカスタムインターセプターのコンストラクターで addAfter() メソッドを呼び出します。

例57.5 現在のインターセプターの前に実行する必要があるインターセプターの一覧の指定

public class MyPhasedOutInterceptor extends AbstractPhaseInterceptor
{

    public MyPhasedOutInterceptor() {
        super(Phase.PRE_LOGICAL);
        addAfter(StartingOutInterceptor.class.getName());
    }

...

}

ほとんどのインターセプターは、インターセプター ID にクラス名を使用します。