第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 メタデータをメッセージから取得するメソッドがあります。