2013-05-15 37 views
10

我使用創建的Web服務:ADBException:意外子元件

  • Apache Axis的2的CodeGen嚮導v.1.6.2(綁定:ADB)
  • 的Eclipse朱諾
  • 的Tomcat 7
  • Java 6的

服務返回客戶端的自定義Java對象(DataBean),但我偶然發現客戶端代碼中的異常:

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message 

從我所研究的結果來看,再重複一次......我認爲這是一個非常普遍的問題,但還沒有得出確鑿的答案,應該如何糾正它。

此論壇和其他論壇上的一些帖子聲明WSDL需要修改(某些名稱空間),或者客戶端存根需要修改。有人甚至表示亞行有一個漏洞。這肯定是早期版本的Axis中的一個bug,但是郵件歸檔中有很多帖子指出bug已修復。這些郵件歸檔與早期版本的Axis2相關。

現在我的問題是:

  1. 這還算是一種錯誤嗎?
  2. 究竟需要在WSDL或客戶端存根中更改什麼?

值得一提的是,我創建了一個類似的Web服務,它將「String」返回給客戶端。它工作正常!所以,當涉及複雜的數據類型時,它會失敗。

有上Apache's website一些信息,標題爲「已知限制」下...

記載:「亞行意味着是一個‘簡單’的數據綁定框架,並不意味着所有的編譯模式類型。以下限制是最突出

  1. 複雜類型的擴展和限制。」

是這樣的問題嗎?

以下是這可能是一些你感興趣的WSDL文件中的片段......

<wsdl:types> 
     <xs:schema xmlns:ax26="http://mywebservice/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="schemaTargetNs"> 
      <xs:import namespace="http://mywebservice/xsd"/> 
      <xs:element name="getMsg"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="reqData" nillable="true" type="ax25:DataBean"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="getMsgResponse"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="return" nillable="true" type="ax25:DataBean"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
     <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mywebservice/xsd"> 
      <xs:complexType name="DataBean"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/> 
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:schema> 
    </wsdl:types> 

現在我該怎樣解決這個問題?我應該在其中包含一些其他代碼片段嗎?

回答

1

CodeGen(來自WSDL)爲我正在使用的Java對象(bean)生成的代碼期望bean的字段有不同的名稱空間。不知何故,由Axis生成的代碼中存在不正確的名稱空間。我修復了名稱空間以反映它應該是什麼,並且一切正常。我可以看到人們仍然在回答這個問題,所以我認爲我會在這裏重新發布我的解決方案(已經發布了這個以響應Kenster的解決方案)。由於在找到解決方案之前發佈的解決方案都沒有成功,我沒有接受任何答案。

10

「意外的子元素」意味着接收者接收到的消息包含接收者不期望的XML元素。 「{schemaTargetNs}消息」是它遇到的意外元素的名稱。換句話說,發送者發送了一個無效的消息給接收者。

  • 發件人可能包含一個它不應該包含的元素。
  • 發件人可能遺漏了一個強制性元素。
  • 發件人可能已按錯誤順序放置元素。
  • 發件人可能發送了一個完全不正確的信息。

如果服務器發出了您報告的異常,則客戶端向服務器發送了無效消息。如果客戶端發出異常,則錯誤發生在服務器到客戶端的響應中。

+0

錯誤肯定是來自服務器的響應,但如何找出預期的元素?除非我知道,否則我將無法解決問題。我有來自服務器的響應XML,對我來說似乎很好。 –

+0

那麼,如果您要在調試器中運行客戶端,和/或如果您有org.apache.axis2.AxisFault的堆棧跟蹤,那麼您可以在消息解析器中找到引發錯誤的特定代碼行。這一點應該很明顯,它期望的是什麼因素。 – Kenster

+0

這可能要歸結爲客戶端基於WSDL的錯誤副本生成的事實。所以服務器發送的響應與客戶預期的不匹配。 – Kenster

5

如果xsd(wsdl)對於xml請求是正確的o響應是因爲問題是xml元素的順序。一個可行的解決方案是使用-Eosv選項生成axis2客戶端。爲我工作。

+0

也爲我效勞! –

0

當我檢查軸線代碼,我發現了以下

if(new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName())) 

這是在錯誤發生, 。 QName的equals()方法檢查localPart & namespaceURI 。但reader.getName()沒有命名空間URI集,因此錯誤happend

我改變了所有的,如果檢查從

if(new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName())) 

if(new javax.xml.namespace.QName("someElementName").equals(reader.getName())) 

,它爲我

工作得很好
0

這個錯誤可能是一種誤導。在我修改WSDL並添加了一個新的必需元素之後,我創建了我的客戶端。比這個錯誤出現了。解決的辦法是,我忘了在我的web服務的一種方法中填充這個元素。如果出現此錯誤,請檢查服務器中是否填寫了強制性元素。

1

看看你的.xsd文件。按照您的<xs:extension base=...>的字母順序排列您的xs元素。這將符合您的需求。

0

在我的情況下,Web Service發送的元素順序與xsd中的順序不同。我現在正在修改存根,所以順序無關緊要,因爲我沒有改變Web服務的機會。

相關問題