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