Axis2终竟能否传递复杂类型参数【求指导篇】

Axis2到底能否传递复杂类型参数【求指导篇】

   首先回顾一下,上篇博客给大家宏观上介绍了webservice框架—Axis,Axis2,CXF,XFire。接下来我们对框架的实践学习,其实,目前的阶段,主要是会实践,会应用。

并且上篇博客中也提到,目前Apache中最流行的两大Webservice框架——Axis2 VS CXF
那我们接下里的博客中会对这两大框架的介绍以及问题解决。其中,也会有疑问的问题,亟需高手指点。
 
若是您对Axis2发布以及调用Webservice不懂的话,可以按照这个开发文档一步步做,肯定会做出来的。
Axis2开发具体实例下载
 
那这篇博客中,不再贴源码了,类似上述的开发文档的小例子,只是方法参数不同而已。发布以及调用的过程都是相同的。
Axis2服务端,发布的服务方式: 配置services.xml文件。在配置文件中,配置发布Webservice名称,服务提供的接口以及暴露的函数。文件如下:
[html] view plaincopyprint?
  1. <?xmlversion="1.0"encoding= "UTF-8"?>
  2. <serviceGroup>
  3. <servicename= "myService"scope ="application">
  4. <description>
  5. MyService
  6. </description>
  7. <messageReceivers>
  8. <messageReceiver
  9. mep= "http://www.w3.org/2004/08/wsdl/in-only"
  10. class= "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
  11. <messageReceiver
  12. mep= "http://www.w3.org/2004/08/wsdl/in-out"
  13. class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
  14. </messageReceivers>
  15. <parametername ="ServiceClass">
  16. com.test.UserService
  17. </parameter>
  18. </service>
  19. </serviceGroup>
   <?xml version="1.0" encoding= "UTF-8"?>
<serviceGroup>
<service name= "myService" scope ="application">
    <description >
        MyService
    </description >
    <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 >
   
    <parameter name ="ServiceClass">
        com.test.UserService
    </parameter >
</service>
</serviceGroup>
若是在测试过程中出现错误如下:
org.apache.axis2.AxisFault: The ServiceClass object does not implement the required method in the following form: OMElement getDocSummary(OMElement e)
则说明没有对方法设置MessageReceiver,则直接配置如下:
[html] view plaincopyprint?
  1. <messageReceivers>
  2. <messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"
  3. class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
  4. </messageReceivers>
   <messageReceivers>
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
   </messageReceivers>
或者:
[html] view plaincopyprint?
  1. <messageReceivers>
  2. <messageReceiver
  3. mep= "http://www.w3.org/2004/08/wsdl/in-only"
  4. class= "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
  5. <messageReceiver
  6. mep= "http://www.w3.org/2004/08/wsdl/in-out"
  7. class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
  8. </messageReceivers>
<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 >

需指教处????
Axis2发布服务生成的wsdl中,若是没有返回值:则Element没有相应的Response;若是参数为空,有返回值;则Element没有相应的方法;若参数为空,返回值也为空,则都没有Element,并且Message也为空。
如: 发布服务类中有个方法:
publicString test(){return"test";}
publicString saySorry(String name){return"Sorry,"+name+".";}
 
那最后生成的wsdl如下:
Axis2终竟能否传递复杂类型参数【求指导篇】
 
这个test方法中没有参数,所以没有输入参数的Element。若是没有返回值,则没有Response的Element的。
但是奇怪的是,在公司实习时,公司中使用的Axis2发布的服务,没有参数,但是依然有Element。只不过Element内部为空。
 
公司里Java端发布的时候,同样也是使用Axis2。但是生成的wsdl不同,难道还需要配置一下,这个问题有待解决……
一直以为,无论什么框架,发布服务,生成的wsdl都是相同的。其实不然。只能说明,wsdl,大方向相同。type,message,bind ,service四大部分。但是具体的样式是不同的。尤其是type中的Element。但是不用担心,我们最好按照w3school规范来写。这样不同语言之间可以方便相互调用。

还有一个问题需要请教
Axis2传递复杂类型的参数问题。在Axis2客户端使用常用的RPC形式,是无法传递List类型的,List<String>也不可以,更何况是自定义对象。
网上提供一种解决办法是,把List再次包装成一个对象,这样的话,Axis2传递自定义对象。
如下:
publicclassUserList {
privateList<User>users;
publicList<User> getUsers() {
returnusers;
}
publicvoidsetUsers(List<User> users) {
this.users= users;
}
}
但是使用RPC形式,返回值是无法转化成自定义对象,错误如下:
org.apache.axiom.om.impl.llom.OMTextImpl 无法转化List
 
这两个问题,有人解决了,可我尝试不正确,是配置的问题还是缺少步骤?
 
其实Axis2发布服务以及调用方式有很多种。调用中最常用也最直接最方便的就是RPC形式了,但是RPC却不能传递复杂类型以及自定义对象参数。