AXIS2ウェブサービスチュートリアル
アパッチAxis2チュートリアルへようこそ。最近、私はApache Axis2のスキルを1.3から最新バージョン1.5.4にアップグレードしようとしていましたが、自己説明可能で最新リリースをカバーしたチュートリアルを見つけることができませんでした。そのため、私の投稿はAxis2 Webサービスチュートリアルの基礎となります。
アパッチAxis2チュートリアル
このチュートリアルを使うべき人は誰ですか? (Kono chūtoriaru o tsukau beki hito wa dare desu ka?)
このチュートリアルは、Apache Axis2を使用してWebサービスを開発および展開したいJavaプログラマーを対象としています。
前提条件
このチュートリアルの範囲は、Axis2を使用してWebサービスを作成し、Javaクライアントプログラムを使用してWebサービスを呼び出し、Soap UIツールを使用してWebサービスをテストすることです。Java、Webサービス、XML、Ant、およびアプリケーションサーバー(Tomcat)の基本的な理解が、チュートリアルを容易に理解するために必要です。
使用されたソフトウェアとツール
-
- Java Development Kit (JDK) 1.6.0(Tomcat 7は最小JDK 1.6を要求します)
-
- Apache Ant 1.7.0(Axis2は最小バージョン1.6.5を要求します)
-
- Apache Axis2 1.5.4(バイナリディストリビューション)
-
- Eclipse 3.6.1プロジェクト開発用IDE(他のIDE(例:NetBeans)も使用できます)
-
- Apache Tomcat 7.0.8
-
- WebサービスのテストにはSoapUIを使用します。
- Mac OS X 10.6.4(私はMac OSで作業していますが、チュートリアルは他のオペレーティングシステムでも動作するはずです。ただし、コマンドの実行には一部変更が必要かもしれません)
システムの設定
-
- 以下の通り、日本語でパラフレーズします。いくつかのオプションがありますが、一つ選んでください。
最新のApache Tomcatの最新バージョンをダウンロードしてください。現時点では、最新のバージョンは7.0.8です。このチュートリアルではそのバージョンを使用しています。最低限のJavaバージョン1.6が必要なので、システムにインストールされていることを確認してください。Java 6がシステムにインストールされていない場合は、まずJava SE Downloadsからダウンロードしてインストールしてください。Tomcat Coreのzipファイル(apache-tomcat-7.0.8.zip)をダウンロードし、システムにインストールするために展開してください。サーバーを起動および停止させるために、JAVA_HOME環境変数を設定してください。
Apache Axis2 1.5.4 Binary DistributionのzipをApache Axis2 – Releasesからダウンロードしてください。このステップは、tomcatにデプロイされるaxis2.warを作成し、プロジェクトで使用されるaxis2ライブラリを取得するために必要です。
Axis2のバイナリディストリビューションのzipファイルを適当なディレクトリに展開してください。axis2-1.5.4/webappディレクトリに移動し、「ant create.war」コマンドを実行してaxis2.warデプロイメントをaxis2-1.5.4/distディレクトリに作成してください。Apache Antがインストールされていない場合は、Apache Ant – Binary Distributionsからダウンロードしてインストールしてください。なお、War Distributionからダウンロードしたaxis2.warに問題が発生しましたが、後で判明しましたが、いくつかのjarがaxis2 War Distributionには欠けていることがわかりました。War Distributionには58個のjarしか含まれておらず、Binary Distributionには63個のjarが含まれています。(どのjarが不足しているかを探すのが面倒でした)
axis2.warをtomcatのwebappsディレクトリにコピーして、tomcatアプリケーションサーバーにデプロイしてください。ホットデプロイメントに対応していない場合は、サーバーを再起動する必要がある場合があります。
https://localhost:8080/axis2/にアクセスし、「Validate」リンクをクリックしてください。Happy AxisページがGREENの色で表示されれば、axis2が正常にデプロイされていることを意味します。システムのセットアップは完了しましたので、これでAxis2のウェブサービスの作成に進めます。
Axis2のWebサービスを作成する
Axis2 Webサービスアーカイブを作成するためには、以下のものが必要です。
-
- Axis2WSImplementationという名前のJavaプロジェクトで、Webサービスとして公開されるクラスがあります。この例では、MyServiceクラスから2つの操作を公開しています。最初の操作は入力がString型で、String型を返します。2番目の操作は入力がMyBeanというJavaオブジェクトで、データの操作を行った後に再びMyBeanオブジェクトとして返します。注意点として、MyBeanクラスはSerializableインターフェースを実装しているため、ネットワーク上で転送することができます。
aar、wsdl、およびクライアント側のスタブとコールバックハンドラークラスを作成するために使用されるAntのbuild.xmlファイル。
axis2アーカイブの一部となるservices.xmlファイル。このファイルはaxis2アーカイブのMETA-INFフォルダに配置されます。
Axis2のWebサービスプロジェクトの説明
MyService.java:Axis2ウェブサービスとして公開される実装クラス。
package com.scdev.ws;
import com.scdev.bean.MyBean;
public class MyService {
public String getData(String input) {
return "Hi" + input;
}
public MyBean getObjectData(MyBean myBean) {
String name = myBean.getName();
int id = myBean.getId();
myBean.setId(id + 100);
myBean.setName("Output: " + name);
return myBean;
}
}
WebサービスのgetObjectData操作の入力および出力であるJavaビーンクラス、MyBean.java。
package com.scdev.bean;
import java.io.Serializable;
public class MyBean implements Serializable {
private static final long serialVersionUID = -1129402159048345204L;
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
services.xml:このxmlファイルにはAxis2ウェブサービス関連のパラメータが含まれています。ServiceClassパラメータは、ウェブサービスとして公開されるクラスを指定します。他の重要なパラメータには、targetNamespaceおよびschemaNamespaceがあります。
<service name="MyService" scope="application" targetNamespace="https://scdev.com/">
<description>
MyService
</description>
<messageReceivers>
<messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
<schema schemaNamespace="https://scdev.com/xsd"/>
<parameter name="ServiceClass">com.scdev.ws.MyService</parameter>
</service>
build.xml:Axis2のタスクを実行するためのAntビルドファイルです。詳細は3つのターゲットが定義されています。
-
- generate.wsdl: このターゲットは、buildフォルダにMyService.wsdlファイルを生成します。targetNamespaceとschemaTargetNamespaceがservice.xmlファイルと同じであることを確認してください。
-
- generate.service: このターゲットは、buildフォルダにaxis2アーカイブを生成します。アーカイブにはservices.xmlファイルが含まれ、アーカイブ名はMyService.aarです。
- generate.client: このターゲットは、クライアント側のクラスを生成します。generate.wsdlを実行してから実行してください。つまり、MyService.wsdlファイルがbuildフォルダに存在する必要があります。
ビルド.xml
<project name="AxisWSImplementation" basedir="." default="generate.service">
<property environment="env"/>
<property name="build.dir" value="build"/>
<path id="axis2.classpath">
<fileset dir="${basedir}/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="compile.service">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.dir}/classes"/>
<mkdir dir="${build.dir}/resources"/>
<!--First let's compile the classes-->
<javac debug="on"
fork="true"
destdir="${build.dir}/classes"
srcdir="${basedir}/src"
classpathref="axis2.classpath">
</javac>
</target>
<target name="generate.wsdl" depends="compile.service">
<taskdef name="java2wsdl"
classname="org.apache.ws.java2wsdl.Java2WSDLTask"
classpathref="axis2.classpath"/>
<java2wsdl className="com.scdev.ws.MyService"
outputLocation="${build.dir}"
targetNamespace="https://scdev.com/"
schemaTargetNamespace="https://scdev.com/xsd">
<classpath>
<pathelement path="${axis2.classpath}"/>
<pathelement location="${build.dir}/classes"/>
</classpath>
</java2wsdl>
</target>
<target name="generate.service" depends="compile.service">
<copy toDir="${build.dir}/classes" failonerror="false">
<fileset dir="${basedir}/resources">
<include name="**/*.xml"/>
</fileset>
</copy>
<jar destfile="${build.dir}/MyService.aar">
<fileset excludes="**/Test.class" dir="${build.dir}/classes"/>
</jar>
</target>
<target name="generate.client" depends="compile.service">
<taskdef name="wsdl2java"
classname="org.apache.axis2.tool.ant.AntCodegenTask"
classpathref="axis2.classpath"/>
<wsdl2java
wsdlfilename="${build.dir}/MyService.wsdl"
output="${build.dir}/resources" />
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
</project>
WSDL、Axisアーカイブ、およびスタブファイルの生成
- Execute generate.wsdl ant target to generate MyService.wsdl file.
- Execute generate.service ant target to generate the MyService.aar file.
- Execute generate.client ant target to generate the Stub classes.
Axis2ウェブサービスの展開
Axis2ウェブサービスのテスト
サービスを展開した後、まずはテストが必要です。ここでは、Webサービスのテストに最適なツールの一つであるSoapUIを使用しています。もし持っていない場合は、彼らのウェブサイトから簡単にダウンロードしてインストールできます。SoapUIを使用したテストの手順は以下の通りです。
-
- 新しいSoapUIプロジェクトを作成し、プロジェクト名を「MyServiceTest」(好きな名前を使用しても構いません)とし、初期WSDL/WADLを「https://localhost:8080/axis2/services/MyService?wsdl」(MyServiceリンクをクリックした後、Axis2サービスのリストページからこのURLを取得できます)とします。その他のオプションはデフォルト値のままにして、OKボタンをクリックしてSoapUIテストプロジェクトを作成してください。
-
- 任意のSoapバインディングの「getData」と「getObjectData」SOAPリクエストをダブルクリックします。
- リクエストに入力値を提供し、それをWebサービスのエンドポイントURLに送信します。下のイメージと同様のサービスからの出力が得られるはずです。これにより、Webサービスが稼働中であることが確認されます。
スタブファイルを使用して、Axis2 Webサービスを呼び出す。
-
- EclipseでJavaプロジェクトAxis2Clientを作成してください。
-
- libフォルダを作成し、ダウンロードしたバイナリディストリビューションのlibフォルダからすべてのAxis2のjarファイルをコピーしてください。これらのjarファイルをプロジェクトのビルドパスに追加してください。
-
- 以前に生成されたMyServiceStub.javaとMyServiceCallbackHandler.javaを正しいパッケージ構造でプロジェクトのsrcにコピーしてください。私の場合、それらをcom.scdevパッケージにコピーしました。これらのクラスを他の人に提供する必要がある場合、変更を避けるためにそれらからjarファイルを作成し、他の人と共有することを強くお勧めします。
- Axis2ClientUsingStubsFromAntクラスを作成し、Webサービスの操作を呼び出すために使用してください。プロジェクトの構造は以下のイメージと似ているはずです。
package com.scdev.ws.client;
import java.rmi.RemoteException;
import com.scdev.MyServiceStub;
import com.scdev.MyServiceStub.GetData;
import com.scdev.MyServiceStub.GetDataResponse;
import com.scdev.MyServiceStub.GetObjectData;
import com.scdev.MyServiceStub.GetObjectDataResponse;
import com.scdev.MyServiceStub.MyBean;
/**
*
* @author Pankaj - www.scdev.com This class will invoke Axis2 web service
* operations using Stub classes
*
*/
public class Axis2ClientUsingStubsFromAnt {
/**
* END_POINT is the web service endpoint
*/
private final static String END_POINT = "https://localhost:8080/axis2/services/MyService";
public static void main(String[] args) throws RemoteException {
System.out.println("START");
// Create the Stub Object by passing the Web Service Endpoint URL
MyServiceStub stub = new MyServiceStub(END_POINT);
// Creating an input object for the getData operation
GetData getDataInput = new GetData();
// Setting the input part in the getData input object
getDataInput.setInput("PANKAJ");
// invoking the getData operation
GetDataResponse getDataOutput = stub.getData(getDataInput);
// get_return method returns the web service output object. Here its
// String, so we can
// directly print the returned value
System.out.println("Output:" + getDataOutput.get_return());
// Creating input object for the getObjectData operation
GetObjectData getObjectDataInput = new GetObjectData();
MyBean myBean = new MyBean();
myBean.setId(1);
myBean.setName("KUMAR");
// Setting the input part in the getObjectData input object
getObjectDataInput.setMyBean(myBean);
// invoking the getObjectData operation
GetObjectDataResponse getObjectDataOutput = stub
.getObjectData(getObjectDataInput);
// Get the MyBean object from the response object
MyBean myBeanOutput = getObjectDataOutput.get_return();
// Print the myBeanOutput values to check that web service operations
// are getting invoked
System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
+ myBeanOutput.getName());
System.out.println("DONE");
}
}
Webサービスを呼び出すために、Axis2ClientUsingStubsFromAntクラスを実行してください。上記のプログラムの出力は次のとおりです。
START
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
log4j:WARN Please initialize the log4j system properly.
Output:HiPANKAJ
ID:101NAME:Output: KUMAR
DONE
もしAxis2の理解や初め方に役立つチュートリアルを見つけた場合、コメント欄でご意見を共有してください。そして、他の人とも共有することを忘れずにしてください。2回のクリックと5秒の時間が他の誰かにとってAxis2の学習を簡単にすることができますよ。:)