Axis2 1.1.1 クイックスタートガイドその1

感想おまちしてます!

このガイドの目的は「サービスの作成」と「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="http://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サービスを試してみる。

http://www.soapui.org/

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が表示されると成功。