Menu Close

第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);

}

Interceptor インターフェースは、開発者がカスタムインターセプターに実装する必要のある 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 メタデータをメッセージから取得するメソッドがあります。