Menu Close

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 にクラス名を使用します。

後のチェーンへの追加

インターセプターに必要なデータが存在しない別の理由は、データがメッセージオブジェクトに配置されていないことです。たとえば、インターセプターは、メッセージデータを 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 にクラス名を使用します。