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: 同じフィールドを 2 回作成しようとしています: subtotal1

この問題の解決策を調査す​​る際に、「-B-XautoNameResolution」オプションを指定して wsimport を実行しようとしましたが、効果がありませんでした。他に考えられる唯一の解決策は、外部バインディング ファイルを使用して wsimport に変数の名前を明示的に伝えることです。しかし、私もそれを機能させるのに苦労しています。重複した変数の 1 つだけに使用しようとしているバインディング ファイルを次に示します。

<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つあることに注意してください。以下に掲載されている解決策は、競合の1つのみを解決します。残りは、内部の<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を正しくするために「node」属性をいじることでした(競合はWSDL内の内部XSDで実際に発生しています)。それを解決した後、正しい<jaxb>要素を指定したことを確認する必要がありました。<jaxb:class>を指定すると、生成された変数のデータ型が変更され、指定された名前で内部クラスが作成されます。これは、私が望んでいたものではありません。<jaxb:property>を指定すると、生成された変数の名前が変更され、重複する名前の競合が解決されます。

于 2013-02-14T20:27:11.250 に答える