本文的前提是已经有一个Spring的项目,在此基础上如何跟Axis2进行结合,开发出WebService服务和调用WebService服务。
1.开放WebService服务
1.引入必要的jar包
将axis2-1.6.2-binaxis2-1.6.2lib所有包引入到你自己的工程中。(当然里面有些是不必要的,有兴趣的可以自己删减)。
2.引入必要的文件,以及创建新的Service.xml
1.将axis2-1.6.2-waraxis2WEB-INF中的conf目录,modules目录,copy到你工程的WEB-INF中。
2.在WEB-INF中,新建services目录(必须),里面可以划分具体的子目录,子目录底下创建META-INF目录(必须),,目录下新建文件:services.xml(必须),
创建完成后,目录结构如下:
service.xml中的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <service name="testWebService"> <description>testWebService</description> <parameter name="ServiceObjectSupplier"> org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier </parameter> <parameter name="SpringBeanName">TestWebService</parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </messageReceivers> <schema schemaNamespace="http://service.telchina.cn" /> </service>
3.修改Web.xml,增加以下配置
<servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
4.修改ApplicationContext.xml
<bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" />
PS:
必须要加此配置,否者报错:
Caused by: java.lang.Exception: Axis2 Can't find Spring's ApplicationContext
官方描述:https://axis.apache.org/axis2/java/core/docs/spring.html
5.创建服务类
package cn.telchina.standard.service; import org.springframework.stereotype.Component; @Component("TestWebService") public class TestWebService { public String sayHello(String name) { return "hello"+name; } }
2.调用WebService服务
调用有两种方式:
1.RPC方式
public void testRPCClient() { try { // axis2 服务端 String url = "http://localhost:8080/axis2Project/services/testWebService"; // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference(url); Options options = serviceClient.getOptions(); //确定目标服务地址 options.setTo(targetEPR); /** * 指定要调用的getPrice方法及WSDL文件的命名空间 * 如果 webservice 服务端由axis2编写 * 命名空间 不一致导致的问题 * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0 */ QName qname = new QName("http://service.telchina.cn", "sayHello"); // 指定getPrice方法的参数值 Object[] parameters = new Object[] { "name" }; // 指定getPrice方法返回值的数据类型的Class对象 Class[] returnTypes = new Class[] { String.class }; // 调用方法一 传递参数,调用服务,获取服务返回结果集 OMElement element = serviceClient.invokeBlocking(qname, parameters); //值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。 //我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果 String result = element.getFirstElement().getText(); System.out.println(result); // // 调用方法二 getPrice方法并输出该方法的返回值 // Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes); // // String r = (String) response[0]; // String r = (String) response[0]; // System.out.println(r); } catch (AxisFault e) { e.printStackTrace(); } }
2.AXIOM方式
/** * 方法二: 应用document方式调用 * 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合 */ public void testDocument() { try { // String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService"; String url = "http://localhost:8080/axis2Project/services/testWebService"; Options options = new Options(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference(url); options.setTo(targetEPR); // options.setAction("urn:getPrice"); ServiceClient sender = new ServiceClient(); sender.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); // 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的 OMNamespace omNs = fac.createOMNamespace("http://service.telchina.cn", ""); OMElement method = fac.createOMElement("sayHello", omNs); OMElement symbol = fac.createOMElement("name", omNs); // symbol.setText("1"); symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String ")); method.addChild(symbol); method.build(); OMElement result = sender.sendReceive(method); System.out.println(result); } catch (AxisFault axisFault) { axisFault.printStackTrace(); } }
PS:
虽然这个例子中使用SPring的注解方式来声明了bean,但是Axis2本身不支持使用@WebService的注解直接声明服务,这个跟CXF是有本质的区别。
在浏览器中输入地址:http://localhost:8080/axis2Project/services/testWebService?wsdl
可以看到:
参考文章:
1.http://www.cnblogs.com/linjiqin/archive/2011/07/05/2098316.html
2.http://sunpfsj.blog.163.com/blog/static/1770500972013424113314769/