AXIS2 Web服务教程
欢迎使用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.aargenerate.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"); } }