2009年4月5日日曜日

Axis2 + Eclipse + WTP でWebサービスを作成する

Rational Application DeveloperでWebサービスを簡単に作れると喜んでいたら、この機能、WTPにも含まれていることが判明。しかも、Axisだけでなく、Axis2にも対応している。というわけで、Axis2を使ってWebサービスを作成してみる。

まずは、準備として、Eclipse + WTPとAxis2をダウンロード。これは単純にダウンロードするだけ。あと、WTPのテストサーバーとしてTomcatもダウンロードし、Eclipseから動かせるようにしておく。

まず、Elipseの設定からAxis2を設定する。メニューの[Window]-[Preferences]を選択し、左のツリーから[Web Services]のツリーを開き、[Axis2 Preferences]をクリックする。右側のペインに、Axis2のRuntime locationを入力する場所が出てくるので、ダウンロードし、展開したAxis2のディレクトリを選びOKをクリック。これで終了。

あとは、Rational Application developerで解説した方法と同じ。[File]-[New]-[Other...]をクリックして出た来たダイアログボックスから、[Web Services]-[Web Service]を選択。ウィザードが起動するので、適当に選んでFinishとすると、Web Serviceのスケルトンが作成される。

Web ServiceはDynamic Web Projectに作成されるので、Eclipseのプロジェクトを見てみると、ソースファイルと、いくつかの設定ファイルが出来ているのがわかる。ソースファイルの中に、Skeleton.javaというものがあり、これがロジックを記述するファイルになる。基本的には、このファイルのみを変更すれば良い。これ以外のファイルは、データ(オブジェクト)用のクラスや、通信用のスタブ&スケルトン。いちおうソースファイルの形で自動生成されるので、微妙にロジックを変更したり、動作を確認したりすることは可能だけれども、変更する必要はない。もちろん変更しても良いのだが、あとでメンテナンスが面倒なので、あまり変更しないほうが良いだろう(そういう意味で、ソース管理に入れるときはSkeletonだけをチェックインし、それ以外のファイルはビルド時に生成すればよい。ただし、これはビルドシステムやプロジェクトルールにもよるので、一概にはいえない)。

WebContentにもいろいろとファイルが出来ている。
まず、WebContentの下にaxis2-webディレクトリがある。これは、Axis2の管理用のWebアプリケーションで、サーバーを起動させた後、axis2-webにアクセスして、使うことができる。Web Serviceがきちんとインストールされているかどうか確認したり、エラーメッセージを確認したり、開発時には有用。
WebContent/WEB-INF以下はもっといろいろ追加されている。
confディレクトリには、axis2で使用する設定ファイルであるaxis2.xmlが入っている。Axis2を動かすためにはとりあえず必須のファイル。
また、lib以下に、必要なjarファイル群がコピーされている。数が多いので、バッティングしないように注意。特に、commons系でバージョン違いには要注意。
modulesディレクトリが出てきており、中にAxis2で使用するモジュールが入っている。
servicesディレクトリには、Web Serviceが格納されている。version.aarというファイルは、Axis2用のWeb Serviceを格納したもの。これと、というディレクトリにクラスファイルが入っている。これがウィザードで作成されたWeb Service。

最後に、web.xml。これもAxis2用に書き換えられている。


さて、では実際に独自のWeb Serviceを任意のWebアプリケーションとともにインストールした場合はどうすれば良いか?必要なのは、web.xmlとconf/axis2.xml、それにバイナリとしてAxis2のライブラリ(jarファイル)とmoduleファイル(modules以下のmarファイル)。それに加えて、実装したWeb Serviceがあればよい。

web.xmlでは、Axis2のライブラリをロードするようにする。これは単純に、自動生成されたweb.xmlから、Axis2関連の以下のところをコピー&ペーストしてくれば良い。
ライブラリ(libディレクトリ)とモジュール(modulesディレクトリ)も自動生成されたDynamic Web Projectからそのままコピーしてくる。ライブラリはともかく、モジュールはいるのか?と思うが、とりあえずなかったら動かなかったので必要なのだろう。必須だったら、jarファイルの中にいれて欲しいのだが。

そして、このAxis2のライブラリを動かすために、conf/axis2.xmlが必要。いろいろと設定ができるが、とりあえず動かすだけなら、コピーすればOK。

ちなみに、WebContent直下に出来たaxis2-webディレクトリは管理アプリケーションなので、Web Serviceを動かすだけなら必要ない。

ここまできたら、後はWEB-INF/servicesディレクトリにWeb Serviceを入れていけば良い。Web Serviceはというディレクトリを作ってその下にclassファイルを直接置いても良いし、aarという拡張子でjarのようにしてもよい。いずれにしてもディレクトリ直下に、META-INFというディレクトリを作り、その下にservices.xmlというファイルを置く必要がある。servicex.xmlはWeb Serviceの定義を記述したもので、どのクラスファイルを使うのかとか、どんなメソッドがあるのかを規定したりする。こうしてaarファイルができたら、servicesディレクト直下に置けばよい。

これで、Web Serviceは完成。あとは、Serverを起動すれば、Web Serviceが公開され、Axis2からだけでなく、Axis、JAX-WS、.netからも接続できるようになる。ただし、エラーが出ることもあるので、そういうときは長いデバッグ作業が待っている。
ちなみに、良くあるエラーはNull Pointer Exception。リクエストとしてオブジェクトを受け取る場合、クライアント側でちゃんと初期化を行わないと、すなわち、Nullのところにデータを入れておかないと、Axis2のフレームワークのところでNull Pointer Exceptionが発生する。あとは、Classが見つからないこと。lib以下のクラスを使用して、そのままそっちに処理を投げて、いろいろ処理を仕様とすると、aarにあるクラスが読み込めない。結果として、Class not found(ドキュメントを精読していないからなんともいえないけど、servicesディレクトリを読むクラスローダーの親がWebアプリケーションのクラスローダーだから?。

0 コメント: