1.AXIS2简介:
Apache Axis2项目是一个基于Java语言的Web services系统服务和客户端的实现。为了从Apache Axis 1.0中获取教训,Apache Axis2提供了一个完整的对象模型和模块化体系结构,这样可以很容易的添加功能以及支持一个新的与Web services相关的说明和建议。Axis2可以让你很容易的执行以下任务:
(1).发送SOAP消息。
(2).接收和处理SOAP消息。
(3).从一个普通的Java类建立Web service。
(4).用WSDL来建立实现服务和客户端的实现类。
(5).很容易的从一个服务来获取WSDL。
(6).发送和接收带有附件的SOAP消息。
(7).建立或者使用基于REST的Web service。
(8).建立或者使用从WS-Security, WS-ReliableMessaging, WS-Addressing, WS-Coordination和WS-Atomic Transaction获取优势的服务。
(9).当新建议出现时,使用Axis2的模块化结构来很容易的加入对它的支持。
2.配置AXIS2环境:
(1).下载Axis2,去http://ws.apache.org/axis2/下载axis2的最新版本,一般是两个zip文件,如axis2-1.4.1-bin.zip(包含了Axis2中所有的jar文件)和axis2-1.4.1-war.zip(用于将WebService发布到web容器中)。
(2). 把axis2-1.4.1-war.zip解压,将目录中的axis2.war文件放到Servlet容器的项目发布目录中,以Tomcat为例,放到”%Tomcat%/webapps”目录中,启动Tomcat。
(3).在浏览器地址栏中输入如下的URL:http://localhost:8080/axis2/”,应该可以进入axis2的欢迎界面,点击”Validate”如果没有报错,则说明axis2的环境已经配置好。
(4).点击”Administration”,初始用户名和密码分别是:admin和axis2,也可以到” %Tomcat%/webapps/axis2/WEB-INF/conf/axis2.xml”下修改用户名和密码。
3.POJO发布成AXIS2 WebService的简单例子:
(1).编程普通的java类,将编译过后的”.class”文件拷贝到axis2的POJO发布目录”%Tomcat%/webapps/axis2/WEB-INF/POJO”中。
注意:若目录下没有POJO目录,则手动新建该目录即可。
(2).启动Tomcat,POJO即被发布成了WebService,java类中中所有的public方法即被发布成WebService的Operation。
注意:POJO类不能使用package关键字声明包,AXIS2默认是热部署的。
4.POJO无配置发布高级:
由于AXIS2的POJO发布方式不支持Package,若类中需要调用其他类的方法时,需要将所引用的类编译后的”.class”文件拷贝到”%Tomcat%/webapps/axis2/WEB-INF/classes”目录下。
编写pojo类User.java,注意:1、网络传输的对象要序列化 2、没有包名 3、先编译成.class文件,在放置到WEB-INF/POJO中,没有该目录,自行创建
public class User implements java.io.Serializable {
private Integer userId;
private String username="Hello world";
private String password;
public Integer getUserId() {
return this.userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
重启tomcat,打开地址:http://localhost:8080/axis2/services/listServices,即可看到已经发布的方法
编写客户端测试方法:
package samland.webservice.demo;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Test {
public static void main(String[] args) {
try {
//使用RPC方式调用WebService:
RPCServiceClient client = new RPCServiceClient();
Options options=client.getOptions();
//指定调用WebService的URL:
EndpointReference targetURL = new EndpointReference("http://localhost:8080/axis2/services/User");
options.setTo(targetURL);
//指定调用服务方法的参数值:
//指定传入参数
Object[] parameters = new Object[]{"wangxiaoya"};
//指定调用的命名空间和方法(setUsername)
QName qname = new QName("http://ws.apache.org/axis2", "setUsername");
//当被调用的方法没有返回值时,应该使用RPCServiceClient类的invokeRobust方法
client.invokeRobust(qname, parameters);
Class[] classes = new Class[]{String.class};
QName qname2 = new QName("User", "getUsername");
//当方法没有参数时,第二个参数值不能为null,而要使用new Object[]{}
Object[] parameters2 = new Object[]{};
//三个参数第一个为QName对象,表示要调用的方法名;第二个参数表示要调用的//WebService方法的参数值;第三个参数表示WebService方法的返回值类型
Object result2 = client.invokeBlocking(qname2, parameters2, classes)[0];
System.out.println(result2);
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果:
Hello world
注意:namespace mismatch错误处理方法
在基于axis2进行WebService开发部署时(使用Java客户端调用服务)可能会报namespace mismatch require http://ws.apache.org/axis2 found http://ws.apache.org/axis2/xsd 这样的错误.根据本人的经验,当使用POJO这种方式开发时,Qname中的参数为http://ws.apache.org/axis2,在基于service.xml开发时其参数为http://service.
当然当命名空间报错时在Java开发环境下,可以从调试窗口发现类似的信息:Exception in thread "main" org.apache.axis2.AxisFault: namespace mismatch require http://service found http://ws.apache.org/axis2 .将命名空间改为require后面的即可。在代码中进行搜索,然后修改即可。