AXIS2 Web服务教程

时间:2020-02-23 14:37:40  来源:igfitidea点击:

欢迎使用Apache Axis2教程。

本教程的范围是使用Axis2创建Web服务,并使用Java客户端程序调用Web服务,并使用Soap UI工具测试Web服务。
为了轻松理解本教程,需要对Java,Web服务,XML,Ant和应用程序服务器(Tomcat)有基本的了解。

使用的软件和工具

  • Java开发工具包(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

  • SoapUI用于测试我们的Web服务。

  • 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 –版本下载Apache Axis2 1.5.4 Binary Distribution zip。
    创建轴2.war并将其部署到tomcat并获取将在项目中使用的axis2库是必需的。

  • 将Axis2二进制分发zip解压缩到任何方便的目录中。
    转到axis2-1.5.4/webapp目录,然后运行" ant create.war"命令在axis2-1.5.4/dist目录中创建axis2.war部署。
    如果您未安装Apache Ant,则可以从Apache Ant – Binary Distributions下载并安装它。
    请注意,我从War Distribution下载的axis2.war遇到了一些问题。
    后来,我发现axis2战争分配中缺少几个罐子。
    战争分配仅包含58个罐子,而二进制分配则包含63个罐子。
    (我很懒惰地发现哪些瓶子不见了。
    )

  • 通过将tomcat2.war复制到tomcat webapps目录中,将其部署在tomcat应用程序服务器中。
    如果服务器不支持热部署,则可能需要重新启动服务器。

  • 转到https://localhost:8080/axis2 /,然后单击"验证"链接。
    如果"快乐轴"页面带有绿色,则表示axis2已成功部署。
    我们的系统设置现已准备就绪,我们可以继续创建Axis2 Web服务。

创建Axis2 Web服务

为了创建Axis2 Web服务档案,我们需要:

  • 一个Java项目(Axis2WSImplementation),其类将作为Web服务公开。
    在我的示例中,我将从MyService类公开两个操作。
    第一个操作getData输入为String并返回String,而第二个操作getObjectData输入为MyBean java对象,并在进行一些数据操作后返回MyBean java对象。
    请注意,MyBean类实现了Serializable接口,以便可以通过网络进行传输。

  • Ant build.xml文件,将用于创建aar,wsdl和客户端存根以及回调处理程序类。

  • services.xml文件,它将是axis2存档的一部分。
    该文件将放置在axis2归档文件的META-INF文件夹中。

项目结构如下图所示。

不要与build文件夹中的内容混淆。
它们将在我们执行build.xml ant文件时创建。

Axis2 Web服务项目说明

MyService.java:实现类,将作为Axis2 Web服务公开。

$ant create.war
Buildfile: build.xml

init:
  [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
   [copy] Copying 59 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp

prepare.repo:
   [copy] 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
   [copy] 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

MyBean.java:Java Bean类,它是Web服务中getObjectData操作的输入和输出。

package com.theitroad.ws;

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

services.xml:Axis2 Web服务相关的参数是此xml文件的一部分。
ServiceClass参数指定将作为Web服务公开的类。
其他重要参数是targetNamespace和schemaNamespace。

services.xml

package com.theitroad.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;
	}

}

build.xml:用于执行Axis2任务的Ant构建文件。
定义了三个目标,其详细信息是:

  • generate.wsdl:此目标在生成文件夹中生成MyService.wsdl文件。
    确保targetNamespace和schemaTargetNamespace与service.xml文件中的相同。

  • generate.service:此目标在生成文件夹中生成axis2存档。
    它在归档文件中包含services.xml文件,归档文件名为MyService.aar

  • generate.client:此目标生成客户端类。
    确保在执行generate.wsdl之后运行此程序,以便MyService.wsdl文件位于构建文件夹中。

build.xml

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

生成WSDL,Axis存档和存根文件

  • 执行generate.wsdl ant目标以生成MyService.wsdl文件。

  • 执行generate.service ant目标以生成MyService.aar文件。

  • 执行generate.client ant目标以生成Stub类。

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进行测试的步骤

  • 创建一个新的SoapUI项目,该项目名称为MyServiceTest(您可以输入任意名称),初始WSDL/WADL为https://localhost:8080/axis2/services/MyService?wsdl(您可以从Axis2 List Services页面获取此URL,之后点击MyService链接。
    )。
    将其他选项保留为默认值,然后单击"确定"按钮以创建SoapUI测试项目。

  • 进行任何Soap Bindings并双击getData和getObjectData SOAP请求。

  • 提供一些用于请求中输入的值,并将其提交到Web服务端点URL。
    您应该从服务获得类似于下图的输出。
    它确认我们的Web服务已启动并正在运行。

现在,我们将继续执行使用Axis2存根类调用Web服务的最后一项任务。

使用存根文件调用Axis2 Web服务

  • 在Eclipse中创建一个Java项目Axis2Client。

  • 创建lib文件夹,然后从下载的二进制分发lib文件夹中复制所有Axis2 jar。
    将这些jar添加到项目的构建路径。

  • 使用正确的包结构将早期生成的MyServiceStub.java和MyServiceCallbackHandler.java复制到项目src中。
    就我而言,我将它们复制到com.theitroad包中。
    如果您必须将这些类提供给其他人,我强烈建议您使用它们创建一个jar,然后将其分发给其他人以避免任何修改。

  • 创建Axis2ClientUsingStubsFromAnt客户端类以调用Web服务操作。
    项目结构将类似于下图。

Axis2ClientUsingStubsFromAnt代码

<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.theitroad.ws.MyService"
 outputLocation="${build.dir}"
 targetNamespace="https://theitroad.local/"
 schemaTargetNamespace="https://theitroad.local/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>

执行Axis2ClientUsingStubsFromAnt类以调用Web服务。
上面程序的输出是:

package com.theitroad.ws.client;

import java.rmi.RemoteException;

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

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

	}

}