AXIS2 Web服务教程

欢迎来到Apache Axis2教程。最近,我正在尝试将我的Apache Axis2技能从1.3版本升级到最新的1.5.4版本,但是我找不到任何自解释且涵盖最新发布的教程。因此,这成为我发布Axis2 Web服务教程的基础。

Apache Axis2 入门教程

apache axis2 tutorial

谁应该使用这个教程?

本教程适用于对使用Apache Axis2开发和部署Web服务感兴趣的Java程序员。

先决条件

这个教程的范围是使用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,例如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下载页面下载并安装。下载Tomcat核心zip文件(apache-tomcat-7.0.8.zip),然后解压缩并安装到您的系统中。设置JAVA_HOME环境变量以启动和停止服务器。

    从Apache Axis2 – Releases下载Apache Axis2 1.5.4二进制发行版zip文件。需要这一步才能创建axis2.war并将其部署到tomcat,以及获取用于项目的axis2库。

    将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文件,而Binary Distribution却包含63个jar文件。(我懒得找出缺少了哪些jar文件。)
    $ ant create.war
    Buildfile: build.xml

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

    prepare.repo:
    [copy] Copying 9 files to /Users/Olivia/Downloads/axis2-1.5.4/dist/temp/WEB-INF
    [mkdir] Created dir: /Users/Olivia/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
    [copy] Copying 1 file to /Users/Olivia/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf

    create.war:
    [war] Building war: /Users/Olivia/Downloads/axis2-1.5.4/dist/axis2.war
    [delete] Deleting directory /Users/Olivia/Downloads/axis2-1.5.4/dist/temp

    构建成功
    耗时:2秒

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

    转到https://localhost:8080/axis2/并点击“Validate”链接。如果Happy Axis页面以绿色显示,则表示axis2已成功部署。我们的系统已经准备就绪,现在可以继续创建Axis2 Web服务了。

axis2 tutorial

创建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文件夹中。
apache axis2 project

Axis2 Web Service 项目解释

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

package com.Olivia.ws;

import com.Olivia.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是一个Java Bean类,在网络服务的getObjectData操作中作为输入和输出。

package com.Olivia.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 web 服务相关的参数。ServiceClass 参数指定了将作为 web 服务暴露的类。其他重要的参数包括 targetNamespace 和 schemaNamespace。

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

build.xml:Ant构建文件,用于执行Axis2任务。定义了三个目标,其详情如下:

    generate.wsdl:此目标在构建文件夹中生成MyService.wsdl文件。确保targetNamespace和schemaTargetNamespace与service.xml文件中的相同。
    generate.service:此目标在构建文件夹中生成axis2归档文件。它包含归档文件中的services.xml文件,归档文件名为MyService.aar。
    generate.client:此目标生成客户端类。确保在执行generate.wsdl之后运行此目标,以便在构建文件夹中存在MyService.wsdl文件。

构建文件.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.Olivia.ws.MyService"
 outputLocation="${build.dir}"
 targetNamespace="https://Olivia.com/"
 schemaTargetNamespace="https://Olivia.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 list services page

Axis2 Web Service Testing坐标轴2网络服务测试

在部署服务后,首先我们需要对其进行测试。这里我使用的是SoapUI,它是用于Web服务测试的最佳工具之一。如果你没有这个工具,你可以从他们的网站上下载并轻松安装。使用SoapUI进行测试的步骤如下。

    使用Project Name为MyServiceTest(您可以任意指定名称)和Initial WSDL/WADL为https://localhost:8080/axis2/services/MyService?wsdl(您可以从Axis2列表服务页面中,点击MyService链接后获得此URL),创建一个新的SoapUI项目。将其他选项保持默认值,然后点击OK按钮创建SoapUI测试项目。
    选择任何一个Soap绑定,双击getData和getObjectData SOAP请求。
    在请求中为输入提供一些值,并将其提交到web服务的端点URL。您应该会获得类似于下面图片的服务输出。这证实了我们的web服务已经启动并运行正常。
Axis2 Web service testing using SoapUI

使用Stub文件进行Axis2 Web服务调用

    在Eclipse中创建一个Java项目Axis2Client。
    创建lib文件夹,并将从下载的二进制发行版lib文件夹中复制所有的Axis2 jars。将这些jar文件添加到项目的构建路径中。
    将之前生成的MyServiceStub.java和MyServiceCallbackHandler.java复制到项目的src文件夹中,并使用正确的包结构。在我的情况下,我将它们复制到com.Olivia包中。如果你需要向其他人提供这些类,我强烈建议先创建一个jar文件,然后与其他人一起分发,以避免任何修改。
    创建Axis2ClientUsingStubsFromAnt客户端类来调用Web服务操作。项目结构将类似于下面的图片。
axis2 tutorial project
package com.Olivia.ws.client;

import java.rmi.RemoteException;

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

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

	}

}

执行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

如果您觉得这个教程对于理解和入门Axis2有所帮助,请在评论区分享您的想法。同时,别忘了与其他人分享。您两次点击和5秒时间可能会帮助别人轻松学习Axis2。 🙂

发表回复 0

Your email address will not be published. Required fields are marked *