2012-02-20 21 views
4

的WSDL看起來是這樣的:陣列包裹在複雜類型的Java代碼(軸1.4)被解開

<xsd:element name="Parent"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element maxOccurs="unbounded" ref="tns:Child"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

預期的行爲

如果我讓軸1.4生成基於WSDL的Java代碼,我期待中的以下我的對象:

public class MyComplexObject { 
    private Parent parent; 
} 

Parent類將包括Child對象的數組。

public class Parent { 
    private Child[] child; 
} 

實際行爲

的實際行爲是Child對象列表被直接限定在父對象的層次:

public class MyComplexObject { 
    private Child[] parent; 
} 

當我們通過填充陣列調用web服務,這將導致以下XML:

<Parent> 
    ... 
</Parent> 
<Parent> 
    ... 
</Parent> 

造成服務器端出現故障。看來,Axis在複雜類型的嵌套數組中遇到了困難。任何人面臨同樣的問題,並知道任何解決方法/修復?

發現

經過一番調查,我能夠通過添加一個空場的XSD定義,產生預期的行爲:

<xsd:element name="Parent"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="Dummy" type="xsd:string"/> 
      <xsd:element maxOccurs="unbounded" ref="tns:Child"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

看來,在這種情況下,軸正確地創建一個Parent包裝對象:

public class Parent { 
    private String dummy; 
    private Child[] child; 
} 

我的XML輸出是正確的:

<Parent> 
    <Dummy>...</Dummy> 
    <Child>...</Child> 
    <Child>...</Child> 
</Parent> 

如此看來,這的確是在軸1.4的錯誤...

回答

5

我最近找到了解決方案。 wsdl2java似乎有一個無證的-w選項,它是--wrapArrays的簡寫。如果你使用了SoapUI生成你的類,你可以選擇此選項:

SoapUI and wsdl2java

如前所述,此選項將創建類「特定模式陣列模式」,比如在我的問題概括的模式。

如果您使用Eclipse來生成Web服務客戶端,則可以通過轉到Eclipse的首選項下的Axis Emitter並檢查相應複選框來配置相同類型的選項。

Eclipse and wsdl2java

1

您是否嘗試過使用-W選項在wsdl2java命令?

Tools reference

-W,--noWrapped 這將關閉的所謂的 「包裝」 文檔/文字樣式的操作的特殊待遇。默認情況下,WSDL2Java將 識別出以下條件:

  • 如果輸入消息是單個零件。
  • 零件是一個元素。
  • 元素具有相同的名稱作爲操作
  • 元素的複雜類型沒有屬性

    當看到這一點,WSDL2Java的將「解包」最高級別的元素,並把每個組件的元素作爲 操作的參數。這種類型的WSDL是Microsoft .NET web服務的默認設置,它在此頂層模式 元素中包括RPC樣式參數。

這也許可以修復它。

+1

這並沒有做的伎倆,但不錯的嘗試:)好點,雖然進一步調查這些工具的參數。 – 2012-02-22 08:04:31