Menu Close

59.3.2. インターセプタープロバイダー API の使用

概要

インターセプターは、インターセプタープロバイダーインターフェース に記載されている InterceptorProvider インターフェースを実装するコンポーネントに登録できます。

インターセプタープロバイダーインターフェース

package org.apache.cxf.interceptor;

import java.util.List;

public interface InterceptorProvider
{
    List<Interceptor<? extends Message>> getInInterceptors();

    List<Interceptor<? extends Message>> getOutInterceptors();

    List<Interceptor<? extends Message>> getInFaultInterceptors();

    List<Interceptor<? extends Message>> getOutFaultInterceptors();
}

インターフェースの 4 つのメソッドにより、エンドポイントのインターセプターチェーンを Java List オブジェクトとして取得できます。Java List オブジェクトによって提供されるメソッドを使用することで、開発者は任意のチェーンにインターセプターを追加および削除できます。

手順

InterceptorProvider API を使用してインターセプターをランタイムコンポーネントのインターセプターチェーンにアタッチするには、以下を行う必要があります。

  1. インターセプターがアタッチされるチェーンでランタイムコンポーネントへのアクセスを取得します。

    開発者は、標準の Java アプリケーションコードからランタイムコンポーネントにアクセスするために Apache CXF 固有の API を使用する必要があります。ランタイムコンポーネントは通常、JAX-WS または JAX-RS アーティファクトを基礎となる Apache CXF オブジェクトにキャストすることでアクセスできます。

  2. インターセプターのインスタンスを作成します。
  3. 適切な get メソッドを使用して目的のインターセプターチェーンを取得します。
  4. List オブジェクトの add() メソッドを使用してインターセプターをインターセプターチェーンにアタッチします。

    通常、このステップはインターセプターチェーンの取得と組み合わされます。

インターセプターのコンシューマーへのアタッチ

プログラムでインターセプターをコンシューマーにアタッチ は、インターセプターを JAX-WS コンシューマーのインバウンドインターセプターチェーンにアタッチするコードを表しています。

プログラムでインターセプターをコンシューマーにアタッチ

package com.fusesource.demo;

import java.io.File;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.apache.cxf.endpoint.Client;

public class Client
{
  public static void main(String args[])
  {
    QName serviceName = new QName("http://demo.eric.org", "stockQuoteReporter");
    Service s = Service.create(serviceName);

    QName portName = new QName("http://demo.eric.org", "stockQuoteReporterPort");
    s.addPort(portName, "http://schemas.xmlsoap.org/soap/", "http://localhost:9000/EricStockQuote");

    quoteReporter proxy = s.getPort(portName, quoteReporter.class);

    Client cxfClient = (Client) proxy;

    ValidateInterceptor validInterceptor = new ValidateInterceptor();
    cxfClient.getInInterceptor().add(validInterceptor);

    ...
  }
}

プログラムでインターセプターをコンシューマーにアタッチ のコードは、以下を行います。

コンシューマーの JAX-WS Service オブジェクトを作成します。

コンシューマーのターゲットアドレスを提供する Service オブジェクトにポートを追加します。

サービスプロバイダーでメソッドを呼び出すために使用されるプロキシーを作成します。

プロキシーを org.apache.cxf.endpoint.Client 型にキャストします。

インターセプターのインスタンスを作成します。

インターセプターをインバウンドインターセプターチェーンにアタッチします。

インターセプターのサービスプロバイダーへのアタッチ

プログラムでのインターセプターのサービスプロバイダーへのアタッチ は、インターセプターをサービスプロバイダーのアウトバウンドインターセプターチェーンにアタッチするコードを表しています。

プログラムでのインターセプターのサービスプロバイダーへのアタッチ

package com.fusesource.demo;
import java.util.*;

import org.apache.cxf.endpoint.Server;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.frontend.EndpointImpl;

public class stockQuoteReporter implements quoteReporter
{
  ...
  public stockQuoteReporter()
  {
    ServerFactoryBean sfb = new ServerFactoryBean();
    Server server = sfb.create();
    EndpointImpl endpt = server.getEndpoint();

    AuthTokenInterceptor authInterceptor = new AuthTokenInterceptor();

    endpt.getOutInterceptor().add(authInterceptor);
  }
}

プログラムでのインターセプターのサービスプロバイダーへのアタッチ のコードは、以下を行います。

基盤となる Apache CXF オブジェクトへのアクセスを提供する ServerFactoryBean オブジェクトを作成します。

Apache CXF がエンドポイントを表すために使用する Server オブジェクトを取得します。

サービスプロバイダーの Apache CXF EndpointImpl オブジェクトを取得します。

インターセプターのインスタンスを作成します。

インターセプターをエンドポイントのアウトバウンドインターセプターチェーンにアタッチします。

インターセプターのバスへのアタッチ

インターセプターのバスへのアタッチ は、インターセプターをバスのインバウンドインターセプターチェーンにアタッチするコードを表しています。

インターセプターのバスへのアタッチ

import org.apache.cxf.BusFactory;
org.apache.cxf.Bus;

...

Bus bus = BusFactory.getDefaultBus();

WatchInterceptor watchInterceptor = new WatchInterceptor();

bus..getInInterceptor().add(watchInterceptor);

...

インターセプターのバスへのアタッチ のコードは、以下を行います。

ランタイムインスタンスのデフォルトバスを取得します。

インターセプターのインスタンスを作成します。

インターセプターをインバウンドインターセプターチェーンにアタッチします。

WatchInterceptor は、ランタイムインスタンスによって作成されるすべてのエンドポイントのインバウンドインターセプターチェーンにアタッチされます。