1. 程式人生 > >Axis2到底能否傳遞複雜型別引數【求指導篇】

Axis2到底能否傳遞複雜型別引數【求指導篇】

    首先回顧一下,上篇部落格給大家巨集觀上介紹了webservice框架—Axis,Axis2,CXF,XFire。接下來我們對框架的實踐學習,其實,目前的階段,主要是會實踐,會應用。     並且上篇部落格中也提到,目前Apache中最流行的兩大Webservice框架——Axis2 VS CXF     那我們接下里的部落格中會對這兩大框架的介紹以及問題解決。其中,也會有疑問的問題,亟需高手指點。     若是您對Axis2釋出以及呼叫Webservice不懂的話,可以按照這個開發文件一步步做,肯定會做出來的。     那這篇部落格中,不再貼原始碼了,類似上述的開發文件的小例子,只是方法引數不同而已。釋出以及呼叫的過程都是相同的。     Axis2服務端,釋出的服務方式: 配置services.xml檔案。在配置檔案中,配置釋出Webservice名稱,服務提供的介面以及暴露的函式。檔案如下:     
   <?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,則直接配置如下:
   <messageReceivers>
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
   </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如下:        這個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卻不能傳遞複雜型別以及自定義物件引數。