クライアントおよびサーバサイドコードの生成(スタブおよびスケルトン)
WSDLの生成が完了したら、次のステップとして、プロデューサおよびコンシューマアプリケーション用のスケルトンおよびスタブをそれぞれ生成します。ここでもEclipseプラグインを使用し、データバインディング用のAxis Data Binding(ADB)オプションを用いてサーバサイドクラスの生成を行います。Axis2およびEclipseプラグインはXMLBeansなど他のデータバインディングもサポートしていますが、今回のサンプルでは単純性からADBを使用します。
ただしADBには各種の制限が付随します。例えばエンタープライズアプリケーションの構築に使用するには、機能面で力不足と思われます。操作面での柔軟性やスキーマバインディング用の機能を完全に備えたツールが必要な場合は、JiBXなどのXMLバインディングツールの方が適しているかもしれません(Axis2はJiBXをサポートしています)。現状でAxis2プロジェクトからはエンドツーエンドのコード生成ツールは提供されていませんが、JiBXプロジェクトからはそうした処理を比較的簡単にこなせるツールが提供されています。
以下、図3の一連のスクリーンショットは、プロデューササイドのスケルトンおよびクライアントサイドのスタブの生成ステップをまとめたものです。
今回のサンプルでは、スケルトンおよびスタブのディレクトリ構成はそれぞれ図4および図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の併用に関する基本的な概念と手順をまとめたものです。

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





SpringServletContextObjectSupplier