2013-02-08 45 views
1

我試圖運行wsimport針對WSDL文件,我無法修改。的WSDL的一部分看起來像這樣:wsimport和WSDL重複變量

<xsd:complexType name="Bapiitemex"> 
    <xsd:sequence> 
     <xsd:element name="ItmNumber" type="n0:numeric6"/> 
     <xsd:element name="PoItmNo" type="n0:char6"/> 
     <xsd:element name="Material" type="n0:char18"/> 
     <xsd:element name="MatEntrd" type="n0:char18"/> 
     <xsd:element name="ShortText" type="n0:char40"/> 
     <xsd:element name="NetValue" type="n0:numeric15"/> 
     <xsd:element name="Currency" type="n0:cuky5"/> 
     <xsd:element name="Subtotal1" type="n0:numeric15"/> 
     <xsd:element name="Subtotal2" type="n0:numeric15"/> 
     <xsd:element name="Subtotal3" type="n0:numeric15"/> 
     <xsd:element name="Subtotal4" type="n0:numeric15"/> 
     <xsd:element name="Subtotal5" type="n0:numeric15"/> 
     <xsd:element name="Subtotal6" type="n0:numeric15"/> 
     <xsd:element name="SUBTOTAL1" type="n0:decimal23.4"/> 
     <xsd:element name="SUBTOTAL2" type="n0:decimal23.4"/> 
     <xsd:element name="SUBTOTAL3" type="n0:decimal23.4"/> 
     <xsd:element name="SUBTOTAL4" type="n0:decimal23.4"/> 
     <xsd:element name="SUBTOTAL5" type="n0:decimal23.4"/> 
     <xsd:element name="SUBTOTAL6" type="n0:decimal23.4"/> 
    </xsd:sequence> 
</xsd:complexType> 

的wsimport是不高興由於包括僅在不同的情況下(「Subtotal1」與「SUBTOTAL1」等)的多個元件。特定的錯誤是

java.lang.IllegalArgumentException: trying to create the same field twice: subtotal1

在研究解決這個問題,我試圖運行與「-B-XautoNameResolution」選項的wsimport,但沒有任何效果。看來唯一可能的解決方案是使用外部綁定文件來明確告訴wsimport如何命名變量。但是,我也很難做這項工作。下面是綁定文件,我嘗試使用只是重複的變量之一:

<jxb:bindings version="1.0" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<jxb:bindings node="//xsd:complexType[@name='Bapiitemex']//xsd:element[@name='Subtotal1']"> 
    <jxb:property name="testSubtotal1"/> 
</jxb:bindings> 

我嘗試過,似乎wsimport的可能不明白什麼,我要求它做。這是不高興我用的「節點」屬性的XPath語法,返回錯誤:

XPath evaluation of "//xsd:complexType[@name='Bapiitemex']//xsd:element[@name='Subtotal1']" results in empty target node

建議,我怎麼能說服的wsimport生成我的Java類給我嗎?

回答

2

經過更多的摸索之後,我終於想出瞭如何編寫一個綁定文件來完成工作。我的解決方案主要基於我在this post中找到的信息。

請注意,我有6種情況下不同的元素名稱的情況。下面發佈的解決方案僅解決其中一個衝突。其餘部分可以通過添加更多內部的jaxws:bindings >元素來解決。

<jaxws:bindings 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    wsdlLocation="PricingDirectCall.wsdl"> 

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='urn:sap-com:document:sap:soap:functions:mc-style']/xsd:complexType[@name='Bapiitemex']/xsd:sequence/xsd:element[@name='Subtotal1']"> 
     <jaxb:property name="testSubtotal1"/> 
    </jaxws:bindings> 

我必須克服的「節點」被擺弄的最大障礙屬性以獲得正確的XPath(衝突是在內部XSD實際上可以存在的在WSDL中)。解決之後,我只需確保我指定了正確的<jaxb>元素。指定< jaxb:類>更改生成變量的數據類型,創建具有指定名稱的內部類,這不是我想要的。指定< jaxb:屬性>更改生成變量的名稱,解決重名衝突。