Axis2でWebサービス構築!その6

クライアント作成

プロジェクト作成
  1. 新規プロジェクトとしてJavaプロジェクトを以下の情報で作成。
    • プロジェクト名:Axis2TestClient
  2. Axis2Testのlib配下をプロジェクト直下へフォルダごとコピーし、ビルドパスへ追加。
Stub作成
  1. 以下のbuild.xmlを準備し、Ant実行でStubを作成。*1
<?xml version="1.0" encoding="UTF-8"?>
<project name="Axis2TestClient" default="stub" basedir=".">
    <property file="build.properties"/>
    <!-- classpath -->
    <path id="cp">
        <fileset dir="lib">
            <include name="*.jar"/>
        </fileset>
    </path>
    <!-- stub -->
    <target name="stub">
        <java classname="org.apache.axis2.wsdl.WSDL2Java" fork="yes">
            <arg value="-uri"/>
            <arg value="http://localhost:8080/Axis2Test/services/TestService.TestPort?wsdl"/>
            <arg value="-p"/>
            <arg value="test"/>
            <arg value="-s"/>
            <arg value="-uw"/>
            <classpath refid="cp"/>
        </java>
    </target>
</project>
呼び出し部分作成
  1. TestServiceCall.javaを作成。
package test;

import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;

public class TestServiceCall {

	/**
	 * main.
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// Stub作成
			TestServiceStub stub = new TestServiceStub();

			// パラメータ設定
			TestServiceStub.TestInfo inInfo = new TestServiceStub.TestInfo();
			inInfo.setParam1("Axis2Test");
			inInfo.setParam2(1);
			String inFilePath = "C:/Axis2TestInput.bmp";
			inInfo.setParam3(new DataHandler(new FileDataSource(inFilePath)));

			// Input出力
			System.out.println("--- in-data ---");
			System.out.println(object2String(inInfo));

			// サービス呼び出し
			TestServiceStub.TestInfo outInfo = stub.getTestInfo(inInfo);

			// Output出力
			System.out.println("--- out-data ---");
			System.out.println(object2String(outInfo));

			// File出力
			String outFilePath = "C:/Axis2TestOutput.bmp";
			FileOutputStream fileOutputStream = new FileOutputStream(outFilePath);
			outInfo.getParam3().writeTo(fileOutputStream);
			fileOutputStream.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Log出力用.
	 * @param p_obj オブジェクト
	 * @return XML出力文字列
	 */
	private static String object2String(Object p_obj) {

		ByteArrayOutputStream bao = new ByteArrayOutputStream();

		/** エンコード */
		XMLEncoder e = new XMLEncoder(new BufferedOutputStream(bao)) {
			/**
			 * @see java.beans.XMLEncoder#writeObject(java.lang.Object)
			 */
			public void writeObject(Object arg0) {
				if (arg0 instanceof DataHandler) {
					// 何もしない
				} else {
					super.writeObject(arg0);
				}
			}
		};
		e.writeObject(p_obj);
		e.flush();
		e.close();

		return bao.toString();
	}
}
実行
  1. TestServiceCallを実行。
  2. Log、画像ファイル出力。
    単純に送ったパラメータを返すだけのWebサービスが動いていることが確認できる。
    以下実行結果。
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
log4j:WARN Please initialize the log4j system properly.
--- in-data ---
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.5.0_16" class="java.beans.XMLDecoder"> 
 <object class="test.TestServiceStub$TestInfo"> 
  <void property="param1"> 
   <string>Axis2Test</string> 
  </void> 
  <void property="param2"> 
   <int>1</int> 
  </void> 
 </object> 
</java> 

--- out-data ---
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.5.0_16" class="java.beans.XMLDecoder"> 
 <object class="test.TestServiceStub$TestInfo"> 
  <void property="param1"> 
   <string>Axis2Test</string> 
  </void> 
  <void property="param2"> 
   <int>1</int> 
  </void> 
 </object> 
</java> 

最後に

一旦Axis2Webサービス構築は終わります。
かなり我流のところがあるので参考になるか不明です。
また、NetBeansで作成の方法やJRE6,Tomcat6で実行するための方法など興味があるので追加できたらと思います。

*1:細かなオプションはApache Axis2 – Axis2 Reference Guide参照。