このガイドの目的は「サービスの作成」と「Axis2を使ったサービスのクライアント」をすばやく開発できること。ここでは簡単なSampleServiceをサンプルとして、作成やデプロイのいくつかの方法を紹介する。同様に、1つか2つ、Axis2のユーティリティーを紹介する。それからクライアントを作成し、それらのサービスにアクセスしてみる。
ほぼ翻訳です。ここではWebサービスの作成、Axis2 Webアプリケーションへのデプロイとテストまでを説明。
原文:http://ws.apache.org/axis2/1_1_1/quickstartguide.html
Note
ドキュメントのコードはStandard Binary Distributionを使っている。具体的にはAXIS2_HOME/sampleディレクトリにある。これらは開発の手助けになる。
関連するsample以下のディレクトリ
- quickstart
- quickstartadb
- quickstartaxiom
- quickstartjibx
- quickstartxmlbeans
中にはantのビルドファイル(build.xml)も含まれている。ビルドファイルを参照すれば、サンプルのコンパイルを簡単に実行できる。
イントロダクション
とりあえず簡単なWebサービスを作ってみる。普通のクラスでよい。
public class SampleService {
private List<String> list = new ArrayList<String>();
public String getHelloWorld(){
return “HelloWorld”;
}
public String getParamView(String str, int i){
return “str = ” + str + ” int = ” + 1;
}
public String getListString(){
String ret = “”;
for(String str : getList()){
ret += str;
}
return ret;
}
public void addParam(String str){
list.add(str);
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
サービスのパッケージやデプロイには4つの方法があるらしい。まずは、このシンプルなJavaクラスをサービスに対応させる方法を見てみる。
準備
- JDK 1.4以上
- Axis2をダウンロードして解凍しておく
- axis2.warファイルをwebappフォルダからTomcatなどのコンテナにデプロイ
- AXIS2_HOMEを環境変数に設定してく(Note:これをやんないと全スクリプトやビルドファイルは動かないぜ)
AXIS2_HOMEを設定せずに、「AXIS2_HOME\lib」内のJarファイルをプロジェクト内のlibフォルダにいれるのもありでしょう。
まずはWSDLファイルが必要になるのでそれを作成。以下のコマンドを使う。
cd D:\daipresents\project\axis2_111\build\classes D:\download\java\axis2-1.1.1\bin\java2wsdl -cp . -cn com.daipresents.axis2_111.SampleService -of SampleService.wsdl
こうすると、D:\daipresents\project\axis2_111\build\classesにWSDLができあがる。この作業は、対象となるクラス(ここではSampleService)に変更があった場合、毎回行わなければならない。
Axis2のサービス
サーバサイドAxis2はいくつかのサーブレットエンジンにデプロイできる。例えばTomcatとかJBossとか。サーバサイドAxis2のディレクトリ構造は以下のようになっている。
axis2-web META-INF WEB-INF classes conf axis2.xml lib activation.jar ... xmlSchema.jar modules modules.list addressing.mar ... soapmonitor.mar services services.list aservice.aar ... version.aar web.xml
Axis2
Webアプリケーションはアプリケーション管理用JSPなどで構成されている。このWebアプリケーションはサービス追加やサービスの利用開始、利用停止
などの機能を提供してくれる。WEB-INFディレクトリには、サービスディレクトリにデプロイされたサービスを、動かすためのJavaクラスや設定ファ
イルが配置される。
axis2.xmlはもっとも主となるファイル。このファイルによって受け取ったメッセージをどうアプリケーションがやりとりするか制御する。Axis2はモジュールディレクトリに定義されたモジュールを適用するかどうか必要がある。
サービスは「*.aar」ファイルとしてデプロイできる。サービスのコンテンツは明確な方法で準備しなければならない。例えば、サンプルで作ったサービスは以下の構造で作られていないければならない。
SampleService - META-INF - services.xml - com - daipresents - axis2_111 - SampleService.class
サービスの名前は「SampleService」
で、これはservices.xmlに定義されている。そして、パッケージ名に合わせて、適切な場所におかれたJavaクラスフォルダもあることがわかる
(com/daipresents・・・というフォルダ)。META-INFディレクトリはサービスについての情報を追加することができるフォルダで、
Axis2は実行するためにそれらの設定ファイルが必要となる。設定ファイルとしてservices.xmlファイルがあり、このファイルはサービス自身
を定義し、サービスとJavaクラスをリンクさせる役割を持っている。
services.xmlは以下のように記述する。説明文の日本語は文字化けした。また、クイックスタート原文に書いてあるservices.xmlでは動かなかった。こんなんばっかです。。。
<?xml version="1.0" encoding="UTF-8"?> <service name="SampleService" scope="application" targetNamespace="//daipresents.com/"> <description>サンプルのサービスです。</description> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </messageReceivers> <schema schemaNamespace="http://axis2_111_SampleService/xsd" /> <parameter name="ServiceClass"> com.daipresents.axis2_111_SampleService.SampleService </parameter> </service>
上記のようにサービスを定義する。異なったメッセージを交換するために、MessageReceiverを関連付けていることがわかる。
META-INFディレクトリには、このアプリケーションに含めるつもりである、カスタムのWSDLファイルを置く場所でもある。と書いていたがなくてもいいみたい。「http://localhost:8080/axis2/services/SampleService?wsdl」とアクセスしたらWSDLが表示された。
デプロイは上記フォルダをサーブレットエンジンのwebappフォルダにおくことで実現可能。また、Jarファイル、Warファイルのように圧縮したファイルとしてaarファイルというものもあり、これをwebappフォルダにおいてもデプロイできる。
aarファイルの作成
antのbuild.xmlを使ってaarファイルを作成してみる。build.xmlは「AXIS2_HOME\samples\quickstart」にあるものを使う。
僕はEclipseを使っているので、サンプルのquickstartフォルダ(AXIS2_HOME\samples\quickstart)を
参考にJavaプロジェクトを作ってみた。build.xmlもコピーしておいて、このビルドファイルをつかって上記フォルダ構造のaarファイルを作成
する。
//Eclipseのプロジェクト構造 axis2_111_SampleService(Eclipseプロジェクトのルートフォルダ) - src - resources - META-INF - services.xml - build - classes - com - daipresents - axis2_111 - SampleService.class - build.xml
プロジェクトのソースフォルダにはsrcを指定。classの出力先にはbuild/classesを指定しておく。
build.xmlの書き換え
今回のサンプルでは以下のようになる。WSDLの作成タスクも用意されているので、上で説明した「java2wsdl」の実行も自動化できる。
<project basedir="." default="generate.service">
<property environment=”env” />
<property name=”AXIS2_HOME” value=”D:\download\java\axis2-1.1.1″ />
<property name=”build.dir” value=”build” />
<path id=”axis2.classpath”>
<fileset dir=”${AXIS2_HOME}/lib”>
<include name=”*.jar” />
</fileset>
</path>
<target name=”compile.service”>
<mkdir dir=”${build.dir}” />
<mkdir dir=”${build.dir}/classes” />
<!–First let’s compile the classes–>
<javac srcdir=”src”
destdir=”${build.dir}/classes”
classpathref=”axis2.classpath”
debug=”on”
fork=”true”/>
</target>
<target name=”generate.wsdl” depends=”compile.service”>
<taskdef name=”java2wsdl”
classname=”org.apache.ws.java2wsdl.Java2WSDLTask”
classpathref=”axis2.classpath” />
<java2wsdl className=”com.daipresents.axis2_111_SampleService.SampleService”
outputLocation=”${build.dir}”
targetNamespace=”http://axis2_111_SampleService.daipresens.com/”
schemaTargetNamespace=”http://axis2_111_SampleService.daipresents.com/xsd”>
<classpath>
<pathelement path=”${axis2.classpath}” />
<pathelement location=”${build.dir}/classes” />
</classpath>
</java2wsdl>
</target>
<target name=”generate.service” depends=”compile.service”>
<!–aar them up –>
<copy todir=”${build.dir}/classes” failonerror=”false”>
<fileset dir=”${basedir}/resources”>
<include name=”**/*.xml” />
</fileset>
</copy>
<jar destfile=”${build.dir}/SampleService.aar”>
<fileset dir=”${build.dir}/classes” />
</jar>
</target>
<target name=”clean”>
<delete>
<fileset dir=”${build.dir}” />
</delete>
</target>
</project>
完成したらbuild.xmlを右クリックしてantビルド(2つあると思うので下を)クリック。ターゲットを選べるので
- clean
- complile.service
- generate.wsdl
- generate.service
の順にチェックし、この順番でantを実行する。実行後、buildフォルダを見ればaarファイルとWSDLファイルが出来上がっているはず。
「Error running javac.exe compiler」と出る場合は、環境変数Pathに「C:\jre1.5.0_06\bin」などのパスを通してあげよう。
デプロイ
「TOMCAT_HOME\webapps\axis2\WEB-INF\services」にaarファイルをコピー。Web上からだと「http://localhost:8080/axis2/」にアクセスしてAdministration>ログイン>Upload Serviceでアップロードできる。
アップロードしたら、左メニューのSystem Components>Available Servicesを開いて
SampleService Service EPR : http://localhost:8080/axis2/services/SampleService Service REST epr : http://localhost:8080/axis2/rest/SampleService
とでていれば成功。
再デプロイもaarファイルの上書きでできるけど、リロードがうまくいかない場合があるので、一回消してAvailable Servicesから消えたことを確認してから、再デプロイしたほうがいいみたい。
デプロイしたWebサービスをテスト
以下のアドレスをブラウザから入力する。
http://localhost:8080/axis2/rest/SampleService/getHelloWorldResponse
すると以下の結果が表示される。
<ns:getHelloWorldResponse xmlns:ns="http://axis2_111_SampleService/xsd"> <ns:return>HelloWorld</ns:return> </ns:getHelloWorldResponse>
引数の必要なサービスを確認する場合は以下のように。
http://localhost:8080/axis2/rest/SampleService/getParamView?str=aragaki&i=100
SOAPメッセージを投げて確認
SOAPを投げるGUIツールとしてsoapUIと言うものがあるので、それを使ってWebサービスを試してみる。
soapUIの使い方
ダウンロードしたzipファイルを解凍してsoapui.batをダブルクリックで起動。
左にProjectsとあるので、右クリック>New WSDL Projectを選択。プロジェクト名(ここではSampleService)を入れて、プロジェクトの定義ファイルを保存。
Projectsの下にSampleServiceと表示されるので、Add WSDL from URLをクリックして「http://localhost:8080/axis2/services/SampleService?wsdl」を入力。全Operationのデフォルトリクエストを作るか聞かれるので、「はい」を選択。SampleServicePortTypeが表示されるので、+をクリックして開くと、Operationが全て表示される。
getHelloWorldを開くとRequest1が表示されるので、ダブルクリックすると、右ペイン左側の「SOAP Request」にSOAPのHeaderとBodyが表示されるはず。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body/> </soapenv:Envelope>
右ペインの上に緑の>ボタンがあるので、それをクリックして送信。すると右ペイン右側の「SOAP Response」にSOAPのレスポンスが表示される。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <ns:getHelloWorldResponse xmlns:ns="http://axis2_111_SampleService/xsd"> <ns:return>HelloWorld</ns:return> </ns:getHelloWorldResponse> </soapenv:Body> </soapenv:Envelope>
「<ns:return>HelloWorld</ns:return>」とHelloWorldが表示されると成功。