AXIS2 Web服務教程

歡迎來到Apache Axis2教程。 最近,我試圖將我的Apache Axis2技能從1.3升級到最新版本1.5.4,但我找不到任何自解釋且涵蓋最新發布的教程。 所以這形成了我關於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. SoapUI用於測試我們的Web服務。
  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 – Releases下載Apache Axis2 1.5.4二進制分發版zip。此步驟是為了創建將部署到tomcat的axis2.war以及獲取在項目中使用的axis2庫。

  3. 將Axis2二進制發行版zip解壓縮到任意方便的目錄。進入axis2-1.5.4/webapp目錄並運行“ant create.war”命令以在axis2-1.5.4/dist目錄中創建axis2.war部署。如果未安裝Apache Ant,可以從Apache Ant – 二進制發行版下載並安裝它。請注意,我曾遇到過從War Distribution下載的axis2.war存在問題。後來,我發現axis2 War Distribution中缺少一些jar。War Distribution僅包含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. 通過將它複製到tomcat webapps目錄中,在tomcat應用程序服務器中部署axis2.war。如果不支持熱部署,您可能需要重新啟動服務器。

  5. 前往https://localhost:8080/axis2/,點擊驗證鏈接。如果Happy Axis頁面以綠色顯示,則表示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以及客戶端stub和回撥處理程序類別。
  3. services.xml 檔案,將成為axis2封存檔案的一部分。此檔案將放置在axis2封存檔案的META-INF資料夾中。

專案結構將類似下面的圖片。 不要混淆build資料夾內容。這些內容將在執行build.xml ant檔案時建立。

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操作的Web服務中的輸入和輸出的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 web service相關參數包含在此xml文件中。ServiceClass參數指定將公開為Web服務的類別。其他重要參數包括targetNamespaceschemaNamespaceservices.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構建文件。有三個定義的目標,詳細如下:

  1. generate.wsdl: 此目標在build文件夾中生成MyService.wsdl文件。確保targetNamespace和schemaTargetNamespace與service.xml文件中的相同。
  2. generate.service: 此目標在build文件夾中生成axis2存檔。它包含存檔中的services.xml文件,檔案名稱為MyService.aar
  3. generate.client: 此目標生成客戶端類別。確保在執行generate.wsdl後運行此目標,以便MyService.wsdl文件存在於build文件夾中。

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存檔和存根文件

  • 執行generate.wsdl Ant目標以生成MyService.wsdl文件。
  • 執行generate.service Ant目標以生成MyService.aar文件。
  • 執行generate.client Ant目標以生成存根類別。

Axis2 Web服務部署

將MyService.aar複製到~apache-tomcat-7.0.8/webapps/axis2/WEB-INF/services目錄中。Axis2支持服務的熱部署,因此您無需重新啟動服務器。在ListServices頁面檢查您的服務部署(https://localhost:8080/axis2/services/listServices)。MyService應該會顯示在那裡並帶有兩個操作。

Axis2 Web服務測試

部署完服務後,首先我們需要進行測試。這裡我使用SoapUI,這是最佳的Web服務測試工具之一。如果您沒有它,您可以從他們的網站上輕鬆下載並安裝它。使用SoapUI進行測試的步驟

  1. 創建一個新的SoapUI項目,項目名稱為MyServiceTest(您可以隨意取名),初始的WSDL/WADL為https://localhost:8080/axis2/services/MyService?wsdl(您可以在Axis2 List服務頁面上點擊MyService鏈接後獲取此URL)。保持其他選項的默認值,然後點擊“確定”按鈕創建SoapUI測試項目。
  2. 選擇任何一個Soap Binding,並雙擊getData和getObjectData SOAP請求。
  3. 在請求中為輸入提供一些值,然後提交到Web服務端點URL。您應該會從服務獲得與下面圖像類似的輸出。這證實了我們的Web服務正在運行。

現在,我們將繼續使用Axis2存根類來調用Web服務的最後一個任務。

使用存根文件調用Axis2 Web服務

  1. 在Eclipse中創建一個Java項目Axis2Client
  2. 創建lib文件夾,並從下載的二進制分發lib文件夾中複製所有的Axis2 jar文件。將這些jar文件添加到項目的構建路徑中。
  3. 在專案的src中複製先前生成的MyServiceStub.javaMyServiceCallbackHandler.java,並使用正確的套件結構進行複製。在我的情況下,我將它們複製到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服務輸出對象。在這裡是
		// 字符串,因此我們可以
		// 直接打印返回的值
		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);

		// 調用getObjectData操作
		GetObjectDataResponse getObjectDataOutput = stub
				.getObjectData(getObjectDataInput);

		// 從響應對象中獲取MyBean對象
		MyBean myBeanOutput = getObjectDataOutput.get_return();

		// 打印myBeanOutput值以檢查Web服務操作
		// 是否被調用
		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