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后面的即可。在代码中进行搜索,然后修改即可。