SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

POJOベースのドメインアプリケーションをWebサービスとして公開する

Apache Axis2とSpringを組み合わせたREST/SOAPベースのWebサービス

ダウンロード サンプルソース (5.0 MB)

クライアントおよびサーバサイドコードの生成(スタブおよびスケルトン)

 WSDLの生成が完了したら、次のステップとして、プロデューサおよびコンシューマアプリケーション用のスケルトンおよびスタブをそれぞれ生成します。ここでもEclipseプラグインを使用し、データバインディング用のAxis Data Binding(ADB)オプションを用いてサーバサイドクラスの生成を行います。Axis2およびEclipseプラグインはXMLBeansなど他のデータバインディングもサポートしていますが、今回のサンプルでは単純性からADBを使用します。

 ただしADBには各種の制限が付随します。例えばエンタープライズアプリケーションの構築に使用するには、機能面で力不足と思われます。操作面での柔軟性やスキーマバインディング用の機能を完全に備えたツールが必要な場合は、JiBXなどのXMLバインディングツールの方が適しているかもしれません(Axis2はJiBXをサポートしています)。現状でAxis2プロジェクトからはエンドツーエンドのコード生成ツールは提供されていませんが、JiBXプロジェクトからはそうした処理を比較的簡単にこなせるツールが提供されています。

 以下、図3の一連のスクリーンショットは、プロデューササイドのスケルトンおよびクライアントサイドのスタブの生成ステップをまとめたものです。

図3 Eclipseプラグインを用いたサーバサイドおよびクライアントサイドのコード生成
図3 Eclipseプラグインを用いたサーバサイドおよびクライアントサイドのコード生成

 今回のサンプルでは、スケルトンおよびスタブのディレクトリ構成はそれぞれ図4および図5のようになります。

図4 生成されるサーバサイド(スケルトン)コード
図4 生成されるサーバサイド(スケルトン)コード
図5 生成されるクライアントサイド(スタブ)コード
図5 生成されるクライアントサイド(スタブ)コード

Springとの統合

 各種のJ2EEアプリケーションは、Spring IoCコンテナを使用することで、クラスの起動、依存性管理、インターセプションに関する高度な柔軟性を確保しています。これらの機能は既にアプリケーションの一部になっているので、これをさらに拡張してAxis2ドリブンのWebサービスに取り込みたいところです。これを簡単に行うために、Axis2には、AxisクラスからSpringコンテキストと従属Beanを初期化するためのSpringサポートが用意されています。

 SpringとAxis2を併用するときの基本的な考え方は、Springを利用して、アプリケーションBeanをサービスのAxis2 Message Receiverに注入するというものです。Axis2はSpringアプリケーションのコンテキストサポートを認識し、適切なサービス実装Beanを特定します。そしてメッセージレシーバは、このBeanを用いた実装の委託を行います。こうした処理に関するすべての設定は、サービス配備記述子である「services.xml」の内部で行われます。

 それでは、サンプルの実装クラス用にSpringの「applicationContext.xml」を定義し、Spring対応のサービスクラスを作成してみましょう。Springコンテキストファイルは下記のように変更します。

<beans>
  <!-- Axis2 web service, but to Spring, 
       its just another bean that has dependencies   -->
  <bean id="springAccountservice" 
class="com.corp.account.domain.accountmanager.AccountserviceSkeleton">
    <property name="service" ref="accountManager"/>
  </bean>
  <!-- just another bean/interface with a wired implementation, 
       which is injected by Spring into the web service -->
   <bean id="accountManager" 
         class="com.corp.account.domain.impl.AccountManagerImpl"> 
   </bean>
</beans>

 「accountManager」はPOJO実装クラスを示しており、「springAccountservice」はプロデューササイドのスケルトンをSpringのロードBeanとして定義しています。ここでの目的はこの「springAccountservice」を取得して、サーバメッセージレシーバに認識させることです。そのためには「services.xml」を下記のように編集します。

<parameter name="serviceObjectSupplier" locked="false">
  org.apache.axis2.extensions.spring.receivers.
   SpringServletContextObjectSupplier
</parameter>

<parameter name="SpringBeanName" locked="false">
    springAccountservice
</parameter>

 ここで定義している「serviceObjectSupplier」というパラメータには、Axis2によりオブジェクトサプライヤクラスが入力として与えられます。SpringServletContextObjectSupplierクラスを使用しているのは、Springアプリケーションコンテキストを「web.xml」内でサーブレットコンテキストとして初期化するためです。これは単なる説明上の便宜的な措置です。アプリケーションコンテキストを明示的にロードする必要がある場合は、Axis2からSpringAppContextAwareObjectSupplierクラスが提供されます。「web.xml」内ではSpringコンテキストが次のように設定されています。

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

 最後に施す変更は、Skeleton実装クラスに関するものです。ここでは実装クラスの注入を行うので、事前ロードされたBeanによるアップデートを行うために、Spring用に空のセッター(setter)メソッドを作成する必要があります。図6は、SpringとAxis2の併用に関する基本的な概念と手順をまとめたものです。

図6 SpringとAxis2の併用
図6 SpringとAxis2の併用

 Springを用いてAxis2 Webサービスを実装するという手法には、いくつかのメリットがあります。POJOベースのビジネス機能実装を拡張してWebサービス呼び出しをサポートすることが簡単にできますし、そうしたアプリケーションに備わった依存性の注入、ワイヤリング、インターセプタを継続して使用することができます。

次のページ
Webサービスと既存アプリケーションドメインとの統合

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Ramanujam A. Rao(Ramanujam A. Rao)

ソフトウェア設計者兼エンジニアで、エンタープライズアプリケーションの設計と配備を専門とする。現在は、エンタープライズアプリケーションアーキテクチャの分野におけるコンサルティングおよび、J2EEプラットフォームを用いたスケーラブルな分散型アプリケーションの構築に関するサポートを行っている。連絡先はarrao@acm.org

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1334 2007/05/28 08:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー