2

我正在尝试对我无法修改的 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 似乎不明白我要它做什么。我对“节点”属性使用的 XPath 语法不满意,返回错误:

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

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

4

1 回答 1

2

经过更多的摸索,我终于想出了如何编写一个绑定文件来使事情正常进行。我的解决方案主要基于我在这篇文章中找到的信息。

请注意,我有 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 正确(冲突实际上发生在 WSDL 内的内部 XSD 中)。在我解决了这个问题之后,我只需要确保我指定了正确的 <jaxb> 元素。指定 <jaxb:class> 会更改生成变量的数据类型,创建具有指定名称的内部类,这不是我想要的。指定 <jaxb:property> 会更改生成变量的名称,从而解决重复名称冲突。

于 2013-02-14T20:27:11.250 回答