AXIS2 Web サービスチュートリアル

ようこそ、Apache Axis2 チュートリアルへ。最近、私はバージョン1.3から最新バージョン1.5.4にApache Axis2スキルをアップグレードしようとしていましたが、わかりやすく、最新リリースをカバーしたチュートリアルが見当たりませんでした。それが、この投稿のAxis2 Webサービスチュートリアルの基盤となります。

Apache Axis2 チュートリアル

このチュートリアルは誰のためですか?

このチュートリアルは、Apache Axis2を使用してWebサービスを開発およびデプロイしたいJavaプログラマーを対象としています。

前提条件

このチュートリアルの範囲は、Axis2を使用してWebサービスを作成し、Javaクライアントプログラムを使用してWebサービスを呼び出し、Soap UIツールを使用してWebサービスをテストすることです。Java、Webサービス、XML、Ant、およびアプリケーションサーバー(Tomcat)の基本的な理解が、このチュートリアルを簡単に理解するために必要です。

使用されるソフトウェアとツール

  1. Java開発キット(JDK)1.6.0(Tomcat 7は最小JDK 1.6を必要とします)
  2. Apache Ant 1.7.0(Axis2には最小バージョン1.6.5が必要です)
  3. Apache Axis2 1.5.4(バイナリディストリビューション)
  4. プロジェクト開発用のEclipse 3.6.1 IDE(他のIDE、たとえばNetBeansも使用できます)
  5. Apache Tomcat 7.0.8
  6. WebサービスのテストにはSoapUIを使用します。
  7. Mac OS X 10.6.4(Mac OSで作業していますが、チュートリアルは他のオペレーティングシステムでも動作するはずです。ただし、コマンドの実行にはいくつかの変更が必要かもしれません)

システム設定

  1. 最新バージョンのApache Tomcatをダウンロードしてください。現時点では、最新バージョンは7.0.8です。このチュートリアルではそれを使用しています。最低限必要なJavaバージョンは1.6なので、システムにインストールされていることを確認してください。Java 6がシステムにインストールされていない場合は、最初にJava SE Downloadsからダウンロードしてインストールする必要があります。Tomcat Coreのzipファイル(apache-tomcat-7.0.8.zip)をダウンロードし、システムにインストールするために展開してください。サーバーを起動および停止するためにJAVA_HOME環境変数を設定してください。

  2. Apache Axis2 1.5.4 Binary Distribution zipをApache Axis2 – Releasesからダウンロードしてください。このステップはaxis2.warを作成し、tomcatにデプロイし、プロジェクトで使用するaxis2ライブラリを取得するために必要です。

  3. Axis2バイナリ配布zipを任意の便利なディレクトリに解凍します。axis2-1.5.4/webappディレクトリに移動し、“ant create.war”コマンドを実行して、axis2.warデプロイメントをaxis2-1.5.4/distディレクトリに作成します。Apache Antがインストールされていない場合は、Apache Ant – バイナリ配布からダウンロードしてインストールしてください。axis2.warのWar配布からダウンロードした後、いくつかの問題が発生しました。後で、axis2 War配布にいくつかのjarが欠落していることがわかりました。War配布には58個のjarしか含まれていないのに対し、バイナリ配布には63個のjarが含まれています。(どのjarが欠落しているかを見つけるのが面倒です。)

    $ ant create.war
    Buildfile: build.xml
    
    init:
        [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
          Copying 59 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
    
    prepare.repo:
          Copying 9 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF
        [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
          Copying 1 file to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
    
    create.war:
          [war] Building war: /Users/pankaj/Downloads/axis2-1.5.4/dist/axis2.war
       [delete] Deleting directory /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
    
    BUILD SUCCESSFUL
    Total time: 2 seconds
    
  4. axis2.warをtomcatのwebappsディレクトリにコピーしてtomcatアプリケーションサーバーに展開してください。ホットデプロイメントをサポートしていない場合は、サーバーを再起動する必要があります。

  5. https://localhost:8080/axis2/に移動し、Validateリンクをクリックしてください。Happy AxisページがGREEN色で表示される場合、axis2が正常に展開されていることを意味します。システムのセットアップは完了し、Axis2 Webサービスの作成に進むことができます。

Axis2 Webサービスの作成

Axis2 Webサービスアーカイブを作成するために、以下が必要です:

  1. A Java Project (Axis2WSImplementation) with a class that will be exposed as a web service. In my example, I am exposing two operations from MyService class. The first operation getData input is String and returns String whereas the second operation getObjectData input is MyBean java object and returns MyBean java object after some data manipulation. Note that MyBean class implements Serializable interface so that it can be transferred over the network.
  2. Ant build.xml ファイル。これはaar、wsdl、およびクライアントサイドのスタブやコールバックハンドラクラスの作成に使用されます。
  3. services.xml ファイル。これはaxis2アーカイブのMETA-INFフォルダに配置されます。

プロジェクトの構造は以下の画像のようになります。 buildフォルダ内の内容に混乱しないでください。これらはbuild.xmlアンドファイルを実行すると作成されます。

Axis2 Webサービスプロジェクトの説明

MyService.java: Axis2 Webサービスとして公開される実装クラス。

package com.journaldev.ws;

import com.journaldev.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;
	}
}

MyBean.java: ウェブサービスのgetObjectData操作の入力および出力となるJava Beanクラス。

package com.journaldev.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: Axis2ウェブサービス関連のパラメータはこのxmlファイルの一部です。ServiceClassパラメータは、ウェブサービスとして公開されるクラスを指定します。他の重要なパラメータはtargetNamespaceschemaNamespaceです。services.xml

<service name="MyService" scope="application" targetNamespace="https://journaldev.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://journaldev.com/xsd"/>
 <parameter name="ServiceClass">com.journaldev.ws.MyService</parameter>
</service>

build.xml: Axis2タスクを実行するためのAntビルドファイルです。定義された3つのターゲットの詳細は次のとおりです:

  1. generate.wsdl: このターゲットは、buildフォルダにMyService.wsdlファイルを生成します。targetNamespaceとschemaTargetNamespaceがservice.xmlファイルと同じであることを確認してください。
  2. generate.service: このターゲットは、buildフォルダにaxis2アーカイブを生成します。アーカイブにはservices.xmlファイルが含まれており、アーカイブ名はMyService.aarです。
  3. generate.client: このターゲットは、クライアント側のクラスを生成します。generate.wsdlを実行してからこのターゲットを実行することで、buildフォルダに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.journaldev.ws.MyService"
 outputLocation="${build.dir}"
 targetNamespace="https://journaldev.com/"
 schemaTargetNamespace="https://journaldev.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アーカイブ、およびスタブファイルの生成

  • MyService.wsdlファイルを生成するには、generate.wsdlアンドターゲットを実行してください。
  • MyService.aarファイルを生成するには、generate.serviceアンドターゲットを実行してください。
  • スタブクラスを生成するには、generate.clientアンドターゲットを実行してください。

Axis2 Webサービスのデプロイ

MyService.aarを~apache-tomcat-7.0.8/webapps/axis2/WEB-INF/servicesディレクトリにコピーします。Axis2はサービスのホットデプロイメントをサポートしているため、サーバーを再起動する必要はありません。ListServicesページ(https://localhost:8080/axis2/services/listServices)でサービスのデプロイを確認してください。MyServiceは、2つの操作を持つことでそこにリストされるはずです。

Axis2 Webサービスのテスト

サービスをデプロイした後、まず最初にテストする必要があります。ここでは、Webサービスのテストに最適なツールの1つであるSoapUIを使用しています。それを持っていない場合は、ウェブサイトから簡単にダウンロードしてインストールできます。SoapUIを使用したテスト手順

  1. プロジェクト名を「MyServiceTest」として、新しいSoapUIプロジェクトを作成します(任意の名前を指定できます)。初期のWSDL/WADLは「https://localhost:8080/axis2/services/MyService?wsdl」とします(このURLは、MyServiceリンクをクリックした後のAxis2のサービス一覧ページから取得できます)。他のオプションはデフォルト値のままにして、OKボタンをクリックしてSoapUIのテストプロジェクトを作成します。
  2. Soapバインディングのいずれかを選択し、getDataとgetObjectDataのSOAPリクエストをダブルクリックします。
  3. リクエストに入力する値を提供し、WebサービスのエンドポイントURLに送信します。以下の画像のようなサービスからの出力が得られれば、私たちのWebサービスが稼働していることが確認できます。

次に、Axis2のスタブクラスを使用してWebサービスを呼び出す最後のタスクに進みます。

スタブファイルを使用したAxis2 Webサービスの呼び出し

  1. Eclipseで「Axis2Client」というJavaプロジェクトを作成します。
  2. libフォルダを作成し、ダウンロードしたバイナリディストリビューションのlibフォルダからすべてのAxis2のJARファイルをコピーします。これらのJARファイルをプロジェクトのビルドパスに追加します。
  3. MyServiceStub.javaMyServiceCallbackHandler.javaをプロジェクトのsrcに正しいパッケージ構造でコピーしてください。私の場合、それらをcom.journaldevパッケージにコピーしました。これらのクラスを他の誰かに提供する場合は、それらからjarを作成してから他の人と共有することを強くお勧めします。これにより、変更を回避できます。
  4. Axis2ClientUsingStubsFromAntクラスを作成して、Webサービスの操作を呼び出します。プロジェクト構造は以下の画像のようになります。

Axis2ClientUsingStubsFromAntコード

package com.journaldev.ws.client;

import java.rmi.RemoteException;

import com.journaldev.MyServiceStub;
import com.journaldev.MyServiceStub.GetData;
import com.journaldev.MyServiceStub.GetDataResponse;
import com.journaldev.MyServiceStub.GetObjectData;
import com.journaldev.MyServiceStub.GetObjectDataResponse;
import com.journaldev.MyServiceStub.MyBean;

/**
 *
 * @author Pankaj - www.journaldev.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");

		// WebサービスのエンドポイントURLを渡してStubオブジェクトを作成
		MyServiceStub stub = new MyServiceStub(END_POINT);

		// getData操作用の入力オブジェクトを作成
		GetData getDataInput = new GetData();

		// getData入力オブジェクトに入力部分を設定
		getDataInput.setInput("PANKAJ");

		// getData操作を呼び出す
		GetDataResponse getDataOutput = stub.getData(getDataInput);

		// get_returnメソッドはWebサービスの出力オブジェクトを返します。ここではStringなので、
		// 返された値を直接出力できます
		// getObjectData操作の入力オブジェクトを作成
		System.out.println("Output:" + getDataOutput.get_return());

		// getObjectData入力オブジェクトに入力部分を設定
		GetObjectData getObjectDataInput = new GetObjectData();
		MyBean myBean = new MyBean();
		myBean.setId(1);
		myBean.setName("KUMAR");

		// getObjectData操作を呼び出す
		getObjectDataInput.setMyBean(myBean);

		// 応答オブジェクトからMyBeanオブジェクトを取得
		GetObjectDataResponse getObjectDataOutput = stub
				.getObjectData(getObjectDataInput);

		// myBeanOutputの値を出力してWebサービスの操作が呼び出されていることを確認
		MyBean myBeanOutput = getObjectDataOutput.get_return();

		// 
		// 
		System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
				+ myBeanOutput.getName());

		System.out.println("DONE");

	}

}

Axis2ClientUsingStubsFromAntクラスを実行してWebサービスを呼び出します。上記プログラムの出力は:

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

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/axis2-web-services-tutorial