Apache 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)。
使用的软件和工具
- 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 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文件夹中。

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"/>
<!--首先编译类文件-->
<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归档和存根文件
- 执行generate.wsdl ant目标以生成MyService.wsdl文件。
- 执行generate.service ant目标以生成MyService.aar文件。
- 执行generate.client ant目标以生成Stub类。
Axis2 网络服务部署

Axis2 网络服务测试
在部署服务后,首先我们需要对其进行测试。这里我使用的是SoapUI,它是用于Web服务测试的最佳工具之一。如果你没有这个工具,你可以从他们的网站上下载并轻松安装。使用SoapUI进行测试的步骤如下。
- 使用项目名称为MyServiceTest(您可以任意指定名称)和初始WSDL/WADL为https://localhost:8080/axis2/services/MyService?wsdl(您可以从Axis2列表服务页面中,点击MyService链接后获得此URL),创建一个新的SoapUI项目。将其他选项保持默认值,然后点击OK按钮创建SoapUI测试项目。
- 选择任何一个Soap绑定,双击getData和getObjectData SOAP请求。
- 在请求中为输入提供一些值,并将其提交到web服务的端点URL。您应该会获得类似于下面图片的服务输出。这证实了我们的web服务已经启动并运行正常。

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

这是文章《AXIS2 Web服务教程》的第3部分(共3部分)。
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 这个类将使用存根类调用Axis2 Web服务操作
*
*/
public class Axis2ClientUsingStubsFromAnt {
/**
* END_POINT是Web服务端点
*/
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创建存根对象
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类型,所以我们可以
// 直接打印返回的值
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
如果您觉得这个教程对于理解和入门Axis2有所帮助,请在评论区分享您的想法。同时,别忘了与其他人分享。您两次点击和5秒时间可能会帮助别人轻松学习Axis2。 🙂