我正在尝试针对我无法修改的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类的建议?
答案 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;更改生成的变量的名称,解决重复的名称冲突。