欢迎来到Apache Axis2教程。最近,我尝试将我的Apache Axis2技能从1.3升级到最新版本1.5.4,但我找不到任何自解释且涵盖最新版本的教程。因此,这成为我发布Axis2 Web Services教程的基础。
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 Downloads下载并安装它。下载Tomcat核心zip(apache-tomcat-7.0.8.zip),然后解压缩以在你的系统上安装它。设置JAVA_HOME环境变量以启动和停止服务器。
-
从Apache Axis2 – Releases下载Apache Axis2 1.5.4二进制发行版zip。这一步是为了创建将部署到tomcat的axis2.war,并获取用于项目的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/pankaj/Downloads/axis2-1.5.4/dist/temp Copying 59 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp prepare.repo: 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 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
-
通过将axis2.war复制到tomcat webapps目录中,在tomcat应用服务器中部署axis2.war。如果不支持热部署,可能需要重新启动服务器。
-
转到https://localhost:8080/axis2/,点击验证链接。如果Happy Axis页面以绿色显示,那么表示axis2已成功部署。现在我们的系统设置已准备就绪,可以继续创建Axis2 Web服务。
创建 Axis2 Web 服务
创建 Axis2 Web 服务存档,我们需要以下内容:
- A Java Project (Axis2WSImplementation) with a class that will be exposed as a web service. In my example, I am exposing two operations from MyService class. The first operation getData input is String and returns String whereas the second operation getObjectData input is MyBean java object and returns MyBean java object after some data manipulation. Note that MyBean class implements Serializable interface so that it can be transferred over the network.
- Ant build.xml 文件,用于创建 aar、wsdl 以及客户端存根和回调处理程序类。
- services.xml 文件,将成为 axis2 存档的一部分。此文件将放置在 axis2 存档的 META-INF 文件夹中。
项目结构将如下图所示。 不要被 build 文件夹中的内容搞混。它们将在执行 build.xml ant 文件时创建。
Axis2 Web 服务项目说明
MyService.java: 将作为 Axis2 Web 服务公开的实现类。
package com.journaldev.ws;
import com.journaldev.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: getObjectData 操作在 Web 服务中的输入和输出的 Java Bean 类。
package com.journaldev.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:Axis2 Web服务相关参数包含在此xml文件中。ServiceClass参数指定将公开为Web服务的类。其他重要参数包括targetNamespace和schemaNamespace。services.xml
<service name="MyService" scope="application" targetNamespace="https://journaldev.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://journaldev.com/xsd"/>
<parameter name="ServiceClass">com.journaldev.ws.MyService</parameter>
</service>
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
<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.journaldev.ws.MyService"
outputLocation="${build.dir}"
targetNamespace="https://journaldev.com/"
schemaTargetNamespace="https://journaldev.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目标以生成存根类。
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进行测试的步骤
- 创建一个名为MyServiceTest的新SoapUI项目(您可以自行命名),并将初始WSDL/WADL设置为https://localhost:8080/axis2/services/MyService?wsdl(您可以在单击MyService链接后,从Axis2 List Services页面获取此URL)。将其他选项保留为默认值,然后单击“确定”按钮创建SoapUI测试项目。
- 选择任意一个SOAP绑定,双击getData和getObjectData SOAP请求。
- 为请求中的输入提供一些值,并将其提交到Web服务端点URL。您应该会从服务中获得类似于下面图像的输出。这证实了我们的Web服务正在正常运行。
现在,我们将继续使用Axis2存根类调用Web服务的最后一个任务。
使用存根文件调用Axis2 Web服务
- 在Eclipse中创建一个名为Axis2Client的Java项目。
- 创建lib文件夹,并从下载的二进制分发lib文件夹中复制所有Axis2 jars。将这些jar包添加到项目的构建路径中。
- 将先前生成的
和 复制到项目的src目录下,并确保包结构正确。在我的例子中,我将它们复制到了com.journaldev包中。如果你需要将这些类提供给其他人,我强烈建议从它们创建一个jar文件,然后再将其分发给其他人,以避免任何修改。 - 创建
客户端类来调用web服务操作。项目结构将类似于下图。
package com.journaldev.ws.client;
import java.rmi.RemoteException;
import com.journaldev.MyServiceStub;
import com.journaldev.MyServiceStub.GetData;
import com.journaldev.MyServiceStub.GetDataResponse;
import com.journaldev.MyServiceStub.GetObjectData;
import com.journaldev.MyServiceStub.GetObjectDataResponse;
import com.journaldev.MyServiceStub.MyBean;
/**
*
* @author Pankaj - www.journaldev.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");
// 通过传递Web服务端点URL创建Stub对象
MyServiceStub stub = new MyServiceStub(END_POINT);
// 为getData操作创建一个输入对象
GetData getDataInput = new GetData();
// 在getData输入对象中设置输入部分
getDataInput.setInput("PANKAJ");
// 调用getData操作
GetDataResponse getDataOutput = stub.getData(getDataInput);
// get_return方法返回web服务的输出对象。这里是,所以我们可以
// 直接打印返回的值
// 为getObjectData操作创建输入对象
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);
// 从响应对象中获取MyBean对象
GetObjectDataResponse getObjectDataOutput = stub
.getObjectData(getObjectDataInput);
// 打印myBeanOutput值以检查web服务操作
MyBean myBeanOutput = getObjectDataOutput.get_return();
// 是否被调用
执行类以调用web服务。以上程序的输出是:
System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
+ myBeanOutput.getName());
System.out.println("DONE");
}
}
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。 🙂
Source:
https://www.digitalocean.com/community/tutorials/axis2-web-services-tutorial