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

來源:互聯網
上載者:User
    首先回顧一下,上篇部落格給大家宏觀上介紹了webservice架構—Axis,Axis2,CXF,XFire。接下來我們對架構的實踐學習,其實,目前的階段,主要是會實踐,會應用。

    並且上篇部落格中也提到,目前Apache中最流行的兩大Webservice架構——Axis2 VS CXF    那我們接下裡的部落格中會對這兩大架構的介紹以及問題解決。其中,也會有疑問的問題,亟需高手指點。        若是您對Axis2發布以及調用Webservice不懂的話,可以按照這個開發文檔一步步做,肯定會做出來的。    Axis2開發具體執行個體下載        那這篇部落格中,不再貼源碼了,類似上述的開發文檔的小例子,只是方法參數不同而已。發布以及調用的過程都是相同的。    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也為空白。    如: 發布服務類中有個方法:    public String
test(){ return "test";}   public String
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傳遞自訂對象。    如下:   public  class UserList
{      private List<User> users;      public List<User>
getUsers() {             return users;     }      public  void setUsers(List<User>
users) {             this. users =
users;     }} 但是使用RPC形式,傳回值是無法轉化成自訂對象,錯誤如下:  org.apache.axiom.om.impl.llom.OMTextImpl 無法轉化List    這兩個問題,有人解決了,可我嘗試不正確,是配置的問題還是缺少步驟?    其實Axis2發布服務以及調用方式有很多種。調用中最常用也最直接最方便的就是RPC形式了,但是RPC卻不能傳遞複雜類型以及自訂對象參數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.