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