Apache CXF

Apache CXFは、Webサービスの開発/公開やアクセスを容易にするための使い勝手の良いオープンソース・フレームワークです。

なぜCXFを利用するのか?

CXFを利用することで、次のようなメリットがあります。

JAX-WSをサポート

CXFは、JAX-WS APIを実装しており、Webサービスを簡単に開発できます。

RESTfulサービス(JAX-RS)をサポート

CXFは、JAX-RSで定められたアノテーションベースのHTTPバインディングをサポートしており、RESTful Webサービスを簡単に開発できます。
JSONもサポートしています。

フロントエンド ・プログラミングモデル

CXFは、フロントエンド・プログラミングモデルという概念をもっており、次の4つのフロントエンドが用意されています。

  • JAX-WS フロントエンド
  • JAX-RS フロントエンド
  • シンプルフロントエンド
  • Java Script フロントエンド

これらのフロントエンドには、Webサービスの公開やアクセスを補助するファクトリや動的なWebサービス・クライアントを作成するためのAPIが用意されています。

使い勝手のよいツール群を提供

CXF は、Java Bean、Web サービス、WSDL 間の変換を行うためのさまざまなツールが用意されています。
また、それらのツールは、Maven や Antからも利用することができます。

複数のトランスポートおよびバインディングをサポート

CXFは、次のトランスポートおよびバインディングをサポートしています。

サポートするトランスポート
HTTP, JMS, JBI, Local(In-VM), Apache Camel transports
サポートするプロトコルバインディング
HTTP, SOAP 1.1/1.2, REST/HTTP, Pure XML, CORBA
サポートするデータバインディング
JAXB 2.x(default), Aegis, SDO, XML Beans

Aegisデータバインディングを採用

CXFは、JAXBの他にAegisデータバインディングもサポートします。Aegisデータバインディングは、JavaオブジェクトとXMLを簡単にマッピングするためのデータバインディング・ライブラリです。JAXBとは異なり、すべてのアノテーションを必要としません。またマップ型を含むコレクションのサポートや幅広いデータ型をサポートします。

WS-*をサポート

CXFは、次の仕様をサポートしています。

  • WS-I Basic Profile
  • WS-Addressing
  • WS-Policy
  • WS-Reliable Messaging
  • WS-Security
  • WS-Security Policy
  • WS-Secure Converstation
  • WS-Trust

Spring統合

CXFは、Spring Frameworkを標準でサポートしており、CXFで作成したWebサービスはSpringベースの軽量コンテナ上にデプロイすることが可能です。

Apacheライセンス

CXFは、Apacheライセンスを採用しています。

POJOベースのWebサービスの作成

実際にCXFを用いてPOJOベースのWebサービスの作成例を紹介します。

開発環境

mavenを利用する場合は、次の依存モジュールをpom.xmlに追加します。

...
	<properties>
		<cxf.version>2.4.1</cxf.version>
	</properties>
...
	<dependencies>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-simple</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<!-- Jetty is needed if you're using the CXFServlet -->
		<dependency> <groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http-jetty</artifactId> 
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-jdk14</artifactId>
			<version>1.6.1</version>
		</dependency>
	</dependencies>
...

mavenが利用できない場合は、http://cxf.apache.org/download.html からアーカイブをダウンロードし、アーカイブに含まれているライブラリを利用して下さい。

Webサービスの作成

この例では、文字列の引数を持ち、文字列を返すだけのシンプルなWebサービスを作成します。
CXFでWebサービスを作成する場合は、Webサービスのインタフェースと実装をわけて作成します。しかし、これはCXFに限ったことではありません。
ソースコードを見てわかるように、CXFのクラスの利用やJAX-WS等のWebサービスに関するアノテーションは一切付与されていない点がポイントです。

サービスインタフェースの作成

package jp.opensquare.sandbox.cxf.pojo.provider;

public interface Hello {
	String sayHi(String text);
}

サービスの実装

package jp.opensquare.sandbox.cxf.pojo.provider;

public class HelloImpl implements Hello {

	@Override
	public String sayHi(String text) {
		return "Hello, " + text;
	}
}

Webサービスの公開

CXFを利用して、実際に作成したPOJOをWebサービスとして公開します。
CXFは、強力なフロンドエンドAPIを持っており、そのAPIを利用することでWebサービスの公開やアクセスが簡単に実現できます。

package jp.opensquare.sandbox.cxf.pojo.provider;

import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;

public class Provider {
	
	private Provider() {
	}

	private void publish() {
		ServerFactoryBean serverFactory = new ServerFactoryBean();
		serverFactory.setServiceClass(Hello.class);
		serverFactory.setServiceBean(new HelloImpl());
		serverFactory.setAddress("http://localhost:9000/helloService");
		serverFactory.getInInterceptors().add(new LoggingInInterceptor());
		serverFactory.getOutInterceptors().add(new LoggingOutInterceptor());

		serverFactory.create();				
	}
	
	public static void main(String[] args) throws Exception {
		new Provider().publish();
		System.out.println("Service ready...");
		Thread.sleep(1000 * 60 * 1);
		System.out.println("Service exiting");
		System.exit(0);
	}
}

この例では、ServerFactoryBean?クラスを利用してPOJOをWebサービスとして公開します。
ソースコードを見てわかるように、ServerFactoryBean?クラスのインスタンスには次のパラメータを与えるだけです。

  • サービスインタフェースの型
  • サービス実装クラスのインスタンス
  • Webサービスの公開URL

CXFは独自のインターセプターを備えており、Webサービスの処理の前後に簡単に介入することができます。この例では、ログ出力を行っています。

公開したWebサービスの確認は、ブラウザから http://localhost:9000/helloService?wsdl にアクセスすることで確認できます。

Webサービスへのアクセス

Webサービスの公開ができましたので、次はWebサービスにアクセスする例を紹介します。
公開したWebサービスからWSDLの取得が可能なので、JAX-WSで用意されているwsimportコマンドを用いてプロキシコードを生成してアクセスすることも可能ですが、今回はCXFのフロントエンドAPIを利用します。

package jp.opensquare.sandbox.cxf.pojo.requestor;


import jp.opensquare.sandbox.cxf.pojo.provider.Hello;

import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;

public class Requestor {

	private Requestor() {
	}
	
	public static void main(String[] args) {
		ClientProxyFactoryBean clientfactory = new ClientProxyFactoryBean();
		clientfactory.setServiceClass(Hello.class);
		clientfactory.setAddress("http://localhost:9000/helloService");
		clientfactory.getInInterceptors().add(new LoggingInInterceptor());
		clientfactory.getOutInterceptors().add(new LoggingOutInterceptor());

		// Create Client
		Hello client = (Hello)clientfactory.create();
		String result = client.sayHi("Apache CXF");
		System.out.println("result: " + result);
		System.exit(0); 		
	}
}

この例では、ClientProxyFactoryBean?クラスを利用してWebサービスにアクセスします。
ソースコードを見てわかるように、ClientProxyFactoryBean?クラスのインスタンスには次のパラメータを与えるだけです。

  • サービスインタフェースの型
  • Webサービスの公開URL

CXFのクライアントのフロントエンドAPIは、動的にプロキシを生成し、Webサービスにアクセスすることができます。

CXF/Spring連携

次にCXFとSpringを組み合わせて利用する場合の例を紹介します。

Webサービスの公開(Spring連携)

Springを利用した開発経験者であれば、とても簡単にCXFとSpringを組み合わせて利用することができます。
次のSpringの定義ファイルは、先に紹介したJava版のWebサービスの公開の例と同じ内容を再現しています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:simple="http://cxf.apache.org/simple"
      xmlns:soap="http://cxf.apache.org/bindings/soap"
      xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">

  <simple:server
  	id="helloService"
  	serviceClass="jp.opensquare.sandbox.cxf.pojo.provider.Hello"
  	address="http://localhost:9000/helloService"
  	start="true">
  	<simple:serviceBean>
  		<bean class="jp.opensquare.sandbox.cxf.pojo.provider.HelloImpl" />
  	</simple:serviceBean>
  	<simple:inInterceptors>
  		<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
  	</simple:inInterceptors>
  	<simple:outInterceptors>
  		<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
  	</simple:outInterceptors>
  </simple:server>  
</beans>

次のようにコンテナを初期化することでWebサービスを公開します。

...
new ClassPathXmlApplicationContext("provider-beans.xml");
...

simple:serverタグ内のstart属性をtrueに設定することで、定義と同時にサービスを公開します。(デフォルトはtrueですが説明のため、あえて定義しています。)

Webサービスへのアクセス(Spring連携)

次のSpringの定義ファイルは、先に紹介したJava版のWebサービスへのアクセスの例と同じ内容を再現しています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:simple="http://cxf.apache.org/simple"
      xmlns:soap="http://cxf.apache.org/bindings/soap"
      xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">

  <simple:client
  	id="helloService"
  	serviceClass="jp.opensquare.sandbox.cxf.pojo.provider.Hello"
  	address="http://localhost:9000/helloService">
  	<simple:inInterceptors>
  		<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
  	</simple:inInterceptors>
  	<simple:outInterceptors>
  		<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
  	</simple:outInterceptors>
  </simple:client>  
</beans>

次のようにコンテナを初期化し、simple:clientタグで定義したインスタンスを取得してWebサービスへアクセスします。

...
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("requestor-beans.xml");

Hello client = (Hello)context.getBean("helloService");
String result = client.sayHi("Apache CXF");
...

シンプルフロントエンドに関する情報は http://cxf.apache.org/docs/simple-frontend-configuration.html も併せて参考にして下さい。

ソースコードについて

このページで紹介したソースコードは、Git Hubで公開しています。

サンプルコードは、https://github.com/rising3/cxf-pojo から取得できます。

その他、関連情報


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-06-16 (木) 16:30:09 (2738d)