第56章 インターセプター API
概要
インターセプターは、ベースインターセプターインターフェイスを拡張する PhaseInterceptor インターフェイスを実装します。このインターフェイスは、インターセプターの実行を制御するために Apache CXF のランタイムによって使用されるメソッドを複数定義し、アプリケーション開発者が実装するのには適していません。インターセプターの開発を簡素化するために、Apache CXF は、拡張可能な多数の抽象インターセプター実装を提供します。
インターフェイス
Apache CXF のすべてのインターセプターは、例56.1「ベースインターセプターインターフェイス」 で紹介しているベースインターセプターインターフェイスを実装します。
例56.1 ベースインターセプターインターフェイス
package org.apache.cxf.interceptor;
public interface Interceptor<T extends Message>
{
void handleMessage(T message) throws Fault;
void handleFault(T message);
}インターセプターインターフェイスは、開発者がカスタムインターセプターに実装する必要のある 2 つのメソッドを定義します。
- handleMessage()
-
handleMessage()メソッドは、インターセプターでほとんどの作業を行います。メッセージチェーンの各インターセプターで呼び出され、処理されたメッセージの内容を受信します。開発者は、このメソッドにインターセプターのメッセージ処理ロジックを実装します。handleMessage()メソッドの実装に関する詳細は、「メッセージの処理」を参照してください。 - handleFault()
-
通常のメッセージ処理が中断された場合に、インターセプターで
handleFault()メソッドが呼び出されます。ランタイムは、インターセプターチェーンをアンワインドするため、呼び出された各インターセプターのhandleFault()メソッドを逆順で呼び出します。handleFault()メソッドの実装に関する詳細は、「エラー後の巻き戻し」を参照してください。
インターセプターの多くでは、インターセプターインターフェイスは直接実装されません。代わりに、例56.2「フェーズインターセプターインターフェイス」 に示される PhaseInterceptor インターフェイスを実装します。PhaseInterceptor インターフェイスは、4 つのメソッドを追加し、インターセプターがインターセプターチェーンに参加できるようにします。
例56.2 フェーズインターセプターインターフェイス
package org.apache.cxf.phase;
...
public interface PhaseInterceptor<T extends Message> extends Interceptor<T>
{
Set<String> getAfter();
Set<String> getBefore();
String getId();
String getPhase();
}抽象インターセプタークラス
PhaseInterceptor インターフェイスを直接実装する代わりに、開発者は AbstractPhaseInterceptor クラスを拡張する必要があります。この抽象クラスは、PhaseInterceptor インターフェイスのフェーズ管理メソッドの実装を提供します。AbstractPhaseInterceptor クラスは、handleFault() メソッドのデフォルト実装も提供します。
開発者は handleMessage() メソッドの実装を提供する必要があります。handleFault() メソッドに異なる実装を指定することもできます。開発者が提供する実装は、汎用の org.apache.cxf.message.Message インターフェイスで提供されるメソッドを使用してメッセージデータを操作できます。
SOAP メッセージと動作するアプリケーションでは、Apache CXF は AbstractSoapInterceptor クラスを提供します。このクラスを拡張すると、handleMessage() メソッドと handleFault() メソッドは、org.apache.cxf.binding.soap.SoapMessage オブジェクトとしてメッセージデータにアクセスできるようになります。SoapMessage オブジェクトには、SOAP ヘッダー、SOAP エンベロープ、およびその他の SOAP メタデータをメッセージから取得するメソッドがあります。