wsimport和带有重复变量的WSDL

时间:2013-02-08 22:58:00

标签: java wsdl wsimport duplicates

我正在尝试针对我无法修改的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:尝试两次创建相同的字段: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似乎不明白我要求它做什么。它对我用于'node'属性的XPath语法不满意,返回错误:

  

XPath评估“// xsd:complexType [@ name ='Bapiitemex'] // xsd:element [@ name ='Subtotal1']”导致空目标节点

关于如何说服wsimport为我生成Java类的建议?

1 个答案:

答案 0 :(得分:2)

经过多次摸索之后,我终于想出了如何编写一个绑定文件来使事情发挥作用。我的解决方案主要基于我在this post中找到的信息。

请注意,我有6个元素名称,仅在大小写上有所不同。下面发布的解决方案仅解决了其中一个冲突。剩余部分可以通过添加更多内部&lt; jaxws:bindings&gt;来解决。元件。

<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>

我必须克服的最大障碍是摆弄'node'属性以使XPath正确(冲突在WSDL中的内部XSD中实际发生)。在我解决之后,我只需要确保我指定了正确的&lt; jaxb&gt;元件。指定&lt; jaxb:class&gt;更改生成的变量的数据类型,创建具有指定名称的内部类,这不是我想要的。指定&lt; jaxb:property&gt;更改生成的变量的名称,解决重复的名称冲突。