2013-02-08 131 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:属性>更改生成变量的名称,解决重名冲突。