Spring、Apache CXF を使用した POJO Web サービスの設計と実装: 第 1 回 CXF と Spring を使った Web サービス作成の概要

オープンソースの Web サービス・フレームワーク、Apache CXF を使用すれば、POJO (Plain Old Java® Object) スタイルの Web サービスを簡単に作成することができます。連載第 1 回目のこの記事では、Spring と CXF を使って POJO を Web サービスとして公開する方法を説明します。また、CXF と Spring Framework との統合についても説明します。

Rajeev Hathi, Senior Software Consultant

Rajeev Hathi's photoRajeev Hathi は、J2EE プラットフォームのソフトウェア・コンサルタントです。J2EE をベースとしたアプリケーションの設計を専門とする彼は、Java および J2EE 技術分野 (Web、EJB、Architect) での SUN 認証を獲得しています。IBM developerWorks には Ajax、Web サービス、DB2、XML 関連の記事で貢献しています。さらに、Java 6 の適用方法に関する本『Hands on Web Services』の共著者でもあります。彼が拠点とするのはインドのムンバイで、スポーツ観戦とロックを聴くことを趣味としています。


developerWorks 貢献著者レベル

Naveen Balani, Software Architect, Systems Documentation, Inc. (SDI)

Naveen Balani's photoNaveen Balani は、IBM India Software Labs (ISL) のアーキテクトで、ISLでは WebSphere Business Services Fabric の設計および開発作業のリーダーを務めています。新しい技術の調査に積極的な彼は、IBM developerWorks ではお馴染みの寄稿者でもあり、今まで Web サービス、ESB、JMS、SOA、アーキテクチャー、オープンソース・フレームワーク、セマンティック Web、J2ME、パーベイシブ・コンピューティング、Spring、Ajax、そしてさまざまな IBM 製品についての記事を書いています。また、『Beginning Spring Framework 2』、『Getting Started with IBM WebSphere Business Services Fabric V6.1』の共著者でもあります。



2008年 7月 24日

はじめに

この記事では、CXF と Spring を使って注文処理用 Web サービスを開発および構築します。この Web サービスは、カスタマーからの注文を処理あるいは検証して一意に決まる注文 ID を返します。この記事を読めば、CXF の概念と機能を適用して Web サービスを開発および構築できるようになります。

システム要件

この記事のサンプル・コードを実行するには、お使いのマシンに必ず以下のソフトウェアをインストールして、セットアップしてください。

  • Java 5 以降
  • Tomcat 5 以降
  • Ant ビルド・ツール
  • CXF バイナリー・ディストリビューション 2.1

上記のディストリビューションをインストールしたら、以下の環境変数を設定します。

  • JAVA_HOME (Java 用)
  • CATALINA_HOME (Tomcat 用)
  • ANT_HOME (Ant 用)
  • CXF_HOME (CXF 用)

一例として、CXF_HOME=C:\apache-cxf-2.1 と設定し、PATH 環境変数に以下を追加します。

  • JAVA_HOME\bin
  • CATALINA_HOME\bin
  • ANT_HOME\bin

CXF を使う理由

Apache CXF はオープンソースのフレームワークで、Web サービスの開発および構築をする上で使い勝手の良い堅牢なインフラストラクチャーになります。このフレームワークではパフォーマンスおよび拡張性に優れたサービスを作成することが可能です。CXF を使って作成したサービスは、Tomcat および Spring ベースの軽量なコンテナー内にデプロイすることも、さらに JBoss、IBM® WebSphere®、あるいは BEA WebLogic などといった高度なサーバー・インフラストラクチャーにデプロイすることもできます。

機能

このフレームワークは以下の機能を提供します。

  • Web サービス標準のサポート: CXF は以下の Web サービス標準をサポートします。
    • JAX-WS (Java API for XML Web Services)
    • SOAP
    • WSDL (Web Services Description Language)
    • MTOM (Message Transmission Optimization Mechanism)
    • WS-Basic Profile
    • WS-Addressing
    • WS-Policy
    • WS-ReliableMessaging
    • WS-Security
  • フロントエンド・モデリング: CXF が提供するフロントエンド・モデリングの概念は、さまざまなフロントエンド API を使用して Web サービスを作成することを可能にします。これらの API を使用する場合、単純なファクトリー Bean と JAX-WS 実装を利用して Web サービスを作成することができます。さらに、動的 Web サービス・クライアントを作成することもできます。
  • ツールのサポート: CXF には、Java Bean、Web サービス、WSDL 間での変換用にさまざまなツールが用意されています。Maven と Ant 統合のサポートを提供する他、Spring 統合をシームレスにサポートします。
  • RESTful なサービスのサポート: CXF は RESTful (Representational State Transfer) なサービスの概念をサポートし、Java プラットフォームの JAX-RS 実装をサポートします (RESTful なサービスに関しては、連載第 2 回で詳しく説明します)。
  • 各種のトランスポートおよびバインディングのサポート: CXF は XML や CSV (Comma Separated Value) など、トランスポートにバインドされる各種形式をサポートします。また、SOAP および HTTP プロトコル・バインディングの他、JAXB (Java Architecture for XML Binding) と AEGIS データ・バインディングもサポートします。
  • XML 以外のバインディングのサポート: CXF は、JSON (JavaScript Object Notation) や CORBA (Common Object Request Broker Architecture) など、XML 以外のバインディングをサポートします。さらに JBI (Java Business Integration) アーキテクチャーおよび SCA (Service Component Architecture) もサポートします。

Web サービスの開発

それでは早速、注文処理用 Web サービスを作成し、JAX-WS フロントエンドを使ってこのサービスを Spring Bean として登録する具体的な方法を見ていきましょう。ここで使用するのはコード・ファーストの手法です。つまり、最初に Java クラスを開発し、それからそのクラスにアノテーションを付けて Web サービスとして指定します。この手法では、一般に以下のステップを実行することになります。

  1. サービス・エンドポイント・インターフェース (SEI) を作成し、Web サービスとして公開するメソッドを定義する。
  2. 実装クラスを作成し、このクラスにアノテーションを付けて Web サービスとして指定する。
  3. beans.xml を作成し、JAX-WS フロントエンドを使ってサービス・クラスを Spring Bean として定義する。
  4. Spring と CXF を統合するための web.xml を作成する。

まず、最初のステップでは注文処理用 Web サービスの SEI を作成します。

注文処理用 Web サービスの SEI を作成する

OrderProcess という名前の SEI を作成します。この SEI が、注文 Bean を引数に取りストリングを返す processOrder メソッドを持つことになります。processOrder メソッドの最終目標は、カスタマーからの注文を処理し、一意に決まる注文 ID を返すことです。

リスト 1. OrderProcess SEI
package demo.order;

import javax.jws.WebService;

@WebService
public interface OrderProcess {
  String processOrder(Order order);
}

リスト 1 を見るとわかるように、OrderProcess SEI は単なる標準 Java インターフェースで、Web サービスとしてのアノテーションが付いているだけに過ぎません。@WebService は、単にインターフェースを Web サービス・インターフェースとして指定するアノテーションです。このインターフェースを使って、クライアントまたはこのサービスのコンシューマーがサービス・メソッドを呼び出します。OrderProcess SEI が持つサービス・メソッドは processOrder だけです。このメソッドは Order を引数として取り、注文 ID をストリングで返します。

リスト 2. OrderProcess サービスの実装
package demo.order;

import javax.jws.WebService;

@WebService(endpointInterface = "demo.order.OrderProcess")
public class OrderProcessImpl implements OrderProcess {

 public String processOrder(Order order) {
  return order.validate();
 }
}

SEI の実装を作成する

前のセクションに記載した SEI の実装を作成するには、実装クラス OrderProcessImpl にも Web サービスとしてのアノテーションを付けます。さらに、このアノテーションでは endpointInterface 属性の値として、前のステップで作成した SEI の完全修飾名を指定します。こうすることによって、このクラスに OrderProcess SEI を実装するように指示するわけです。これは SEI の実装なので、注文 ID を返す processOrder メソッドの実装を指定する必要があります。

これで、SEI とその実装は作成できました。次は、CXF を使用する番です。JAX-WS フロントエンドを使って、この SEI の実装を実際のサービス・コンポーネントにします。

リスト 3. beans.xml 構成ファイル
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

 <import resource="classpath:META-INF/cxf/cxf.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
 <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 

 <jaxws:endpoint 
  id="orderProcess" 
  implementor="demo.order.OrderProcessImpl" 
  address="/OrderProcess" />
	  
</beans>

CXF の構成ファイルを作成する

CXF 構成ファイルは、実際には Bean 定義が含まれる Spring 構成ファイルです。OrderProcess Web サービスの Bean 定義は、JAX-WS フロントエンド構成を使って作成します。beans.xml ファイルの <jaxws:endpoint> タグは、OrderProcess Web サービスを JAX-WS エンドポイントとして指定します。これは事実上、CXF はこの Web サービスを公開するために、内部で JAX-WS を使用するということです。そのため、実装クラス名には OrderProcessImpl と指定し、<jaxws:endpoint> タグへのアドレスを指定する必要があります。このアドレスは、Web コンテキストに対する相対アドレスの形で指定します。

リスト 4. web.xml Web 構成ファイル
<web-app>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>WEB-INF/beans.xml</param-value>
 </context-param>

 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>

 <servlet>
  <servlet-name>CXFServlet</servlet-name>
  <display-name>CXF Servlet</display-name>
  <servlet-class>
   org.apache.cxf.transport.servlet.CXFServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>CXFServlet</servlet-name>
  <url-pattern>/*</url-pattern>
 </servlet-mapping>
</web-app>

締めくくりとして必要な作業は以下のとおりです。

  • CXF 構成ファイルをロードするための web.xml ファイルを作成する。
  • Spring コンテキスト・ローダーを使用して構成ファイルをロードする。
  • クライアント・プログラムからのすべてのリクエストを処理する CXFServlet を登録する

ここまでのところで、必要なサーバー・サイド・コンポーネントの開発は完了しました。ここからは、OrderProcess サービスに対してリクエストを送信するクライアント・コンポーネントの開発に移ります。


クライアントの開発

サービス・エンドポイントは簡単に作成できましたが、リスト 5 を見るとわかるように、クライアント Bean を作成するのもわけありません。OrderProcess Web サービスのクライアント Bean を作成するには、JaxWsProxyFactory を使用します。このファクトリー Bean はサービス・クラス (OrderProcess) とサービスの URL を受け取ると、ファクトリー Bean の参照を使用してクライアント Bean のスタブ、OrderProcess を作成します。

リスト 5. client-bean.xml クライアントの Web 構成ファイル
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws 
http://cxf.apache.org/schema/jaxws.xsd">

 <bean id="client" class="demo.order.OrderProcess" 
  factory-bean="clientFactory" factory-method="create"/>
	
 <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
  <property name="serviceClass" value="demo.order.OrderProcess"/>
  <property name="address" value="http://localhost:8080/orderapp/OrderProcess"/>
 </bean>
	  
</beans>

Spring コンテキストを使ってクライアント Bean を定義する Java main プログラムを作成してから、processOrder メソッドを呼び出してください。

リスト 6. クライアント・コード
public final class Client {

 public Client() {
 }

 public static void main(String args[]) throws Exception {
  ClassPathXmlApplicationContext context 
   = new ClassPathXmlApplicationContext(new String[] 
     {"demo/order/client/client-beans.xml"});

  OrderProcess client = (OrderProcess)context.getBean("client");
    Order order = new Order();

  String orderID = client.processOrder(order);
  System.out.println("Order ID: " + orderID);
  System.exit(0);
 }
}

プログラムの実行

プログラムを実行する前に、ルートである C:\ フォルダーの下に図 1 に示すディレクトリー構造を作成し、この記事でこれまでに説明したコンポーネントを以下のように配置してください。

  • Java コードをパッケージ・フォルダーに配置します。
  • beans.xml と web.xml は web\web-inf フォルダーに配置します。
  • client-beans.xml は demo\order\client フォルダーに配置します。
図 1. コードのディレクトリー構造
コードのディレクトリー構造

OrderProcess Web サービスおよびクライアントのビルド、デプロイメント、実行には Ant ツールを使用します。コードがデプロイされる場所は Tomcat サーバーです。c:\orderapp フォルダーで ant deploy コマンドを実行して、コードをデプロイしてください。

このアプリケーション・フォルダー (c:\orderapp) には Ant ビルド・ファイルが含まれます。上記のコマンドを実行すると、orderapp コードが orderapp.war ファイルとして Tomcat サーバー環境にデプロイされます。次に、CATALINA_HOME\bin フォルダーで catalina start コマンドを実行して、Tomcat Web サーバーを起動します。

Tomcat の webapps フォルダーの下には orderapp フォルダーが作成されているので、サーバーが起動したら ant client コマンドを実行してアプリケーションを実行してください。すると、出力に注文 ID が表示されます (図 2 を参照)。

図 2. プログラムの出力
プログラムの出力

まとめ

この記事では CXF フレームワークの機能を簡単に説明し、このフレームワークでは少ないコーディング作業で Web サービスを作成できることを実例で示しました。この例のなかで、Bean コンテキスト・ファイルを使用した Spring と CXF の統合について学びました。さらにこのフレームワークによって Web サービス・インフラストラクチャー・コンポーネントを作成する際の実際のセマンティクスが抽象化され、Web サービスの作成だけに重点を置いた単純な API が提供される仕組みについても理解できたはずです。

連載第 2 回では、今回学んだ CXF を使った Web サービス作成についての基礎を基に、CXF と Spring を使って POJO を Restful なサービスとして公開する方法を説明します。お見逃しなく。


ダウンロード

内容ファイル名サイズ
Order applicationorderapp.zip11KB

参考文献

学ぶために

製品や技術を入手するために

  • IBM ソフトウェアの試用版を使用して、次の開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services, Open source
ArticleID=332913
ArticleTitle=Spring、Apache CXF を使用した POJO Web サービスの設計と実装: 第 1 回 CXF と Spring を使った Web サービス作成の概要
publish-date=07242008