原文出处:
袁鸣凯
一、总结前一天
前一天中我们讲述了如何生成一个Axis2的WebService, 如何布署以及4种不同的客户端, 它们是: 传统式, 非阻塞式, 双工模式, 双工非阻塞。
并且我们看到了一个Axis2的Web Service的布署描述:
<service name="HelloWorld"> <parameter name="ServiceClass">org.sky.axis2.helloworld.HelloWorld</parameter> <operation name="sayHello"> <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/> <actionMapping>urn:sayHello</actionMapping> </operation> </service>
这个描述代表我们的这个Web Service的方法有一进一出两个参数,且是Axis2特有的” OMElement”类型。
那么,我们想要一个public String sayHello(String name)这样的一种简单的java类型来书写我们的WebService可以吗?
当然,只不过我们的布署描述和我们的客户端调用返回值上稍稍有一些不一样。
二、使用简单Java类型书写我们的WebService
HelloJava类:
package org.sky.axis2.helloworld.javatype; import javax.xml.stream.XMLStreamException; import org.apache.axiom.om.OMElement; public class HelloJava { public String sayHello(String name) throws XMLStreamException { StringBuffer hello = new StringBuffer(); hello.append("hello: "); hello.append(name); return hello.toString(); } }
Service描述文件:
此时我们相应的布署文件就是service.xml文件内容稍稍不一样,来看
<service name="HelloJava"> <parameter name="ServiceClass" locked="false"> org.sky.axis2.helloworld.javatype.HelloJava </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </messageReceivers> <actionMapping>urn:sayHello</actionMapping> </service>
我们把这个WebService布署入Tomcat后启动起来看
是不是多了一个Service叫”HelloJava”。
我们把这个Service的wsdl地址导入SOAP UI工具并生成模拟客户端,然后再来看看它的调用与返回值。
注意这个返回值:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns:sayHelloResponse xmlns:ns="http://javatype.helloworld.axis2.sky.org"> <ns:return>hello: Simon Shen</ns:return> </ns:sayHelloResponse> </soapenv:Body> </soapenv:Envelope>
标有红色加粗的部分,反正一粗,就有用就是好东西(我喜欢粗,YEAH)。
再来比较一下昨天我们用“org.apache.axis2.receivers.RawXMLINOutMessageReceiver”这个Service描述生成的返回值
org.apache.axis2.receivers.RawXMLINOutMessageReceiver
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <hel:sayHello xmlns:hel="http://helloworld.axis2.sky.org"> <!--Optional:--> <hel:sayHello>Monica</hel:sayHello> </hel:sayHello> </soapenv:Body> </soapenv:Envelope>
看到区别没有?于是,更改我们的客户端调用代码如下,在此我们使用异步双工模式:
org.sky.axis2.helloworld.javatype.HelloJavaWithReturnDualNonBlock
package org.sky.axis2.helloworld.javatype; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axis2.AxisFault; import org.apache.axis2.Constants; import org.apache.ax