3

wsimportを使用するときに、WSDL内でインポートされたXSDのJAXBバインディングを指定するにはどうすればよいですか?

バインディングを追跡しようとしましたが、「// xs:element [@ name='isFoobar']のXPath評価でターゲットノードが空になります」というエラーが発生します。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="example.wsdl"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <jaxws:bindings node="wsdl:definitions">
        <jaxws:bindings node="wsdl:types" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
            <jaxws:bindings
                node="//xs:schema[@targetNamespace='http://www.example.org/']">
                <jaxb:globalBindings>
                    <xjc:serializable uid="10000001" />
                </jaxb:globalBindings>
                <jaxb:bindings
                    node="//xs:element[@name='isFoobar']">
                    <jaxb:typesafeEnumClass name="IsFoobar">
                        <jaxb:typesafeEnumMember value="01" name="TRUE" />
                        <jaxb:typesafeEnumMember value="02" name="FALSE" />
                    </jaxb:typesafeEnumClass>
                </jaxb:bindings>
            </jaxws:bindings>
        </jaxws:bindings>
    </jaxws:bindings>
</jaxws:bindings>

何か案は?

4

3 に答える 3

2

ネクロスレッディングで申し訳ありませんが、私はこの問題に遭遇しました。これは、さまざまなキーワードの組み合わせでグーグルに表示された最初の答えの1つですが、最終的に使用した答えを保持していませんでした。


インポートされたスキーマの場合、WSDL内のインポートされたXSDでJAXBバインディングを指定する最も簡単な方法は、それを完全に異なるスキーマとして扱うことです。

簡単な例:

MyXSD.xsd

<xsd:schema targetNamespace="whatever"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="ThingThatNeedsToBeBound">
        <!-- Whatever this is made of -->
    </xs:complexType>
</xsd:schema>

このxsdがインポートされる場所(wsdlのルートにあるかネストされたインポート内にあるか)に関係なく、カスタムバインディングで「ThingThatNeedsToBeBound」をバインドするために記述する必要があるのは次のとおりです。

customBindings.xml

<jaxb:bindings schemaLocation="Path/To/MyXSD.xsd" node="/xs:schema/xs:complexType[@name='ThingThatNeedsToBeBound']">
    <!-- your custom binding -->
</jaxb:bindings>

したがって、schemaLocationを指定することを除いて、通常の場合と同じですが、インポートされたスキーマは、何かの一部ではなく、全体として考えることができます。

これが他の人がこの問題に遭遇するのに役立つことを願っています。


出典:http ://www.oracle.com/technetwork/articles/grid/jax-ws-jaxb-customization-082750.html

(注:ソースでは、解決策ははるかに複雑に見えるので、私の場合は彼らが説明したものよりも単純だったかもしれませんが、それでもそれを使用して私の解決策を見つけました!)

于 2017-03-13T17:01:52.233 に答える
1

これを解決するための最初の試みは、XPathまたは複数のjxb:binding要素を何らかの方法で使用しようとしたことでしたが、それは機能しませんでした。私の知る限り、XPathは、すべてがDOMと一緒に書き直されてマッシュされない限り、インポートされたスキーマに対して適切に検証されません。

したがって、この問題を解決する方法は、インポートされたXSDでインラインカスタマイズを使用することでした。複数のネストされたインポートを使用してこのアプローチをテストしませんでしたが、インポートされたすべてのXSDにアクセスして変更する時間があれば、これは問題なく機能するはずです。私の意見では、これはマッピングを生成する必要がある場合にのみ必要であり、マッピングが完了したらXSDからスクラブ/削除できます。

于 2011-09-23T13:05:36.720 に答える
1

私は何年も前に同じようなことをしました。XPathで選択するノードを次のように指定する必要があると思います。

//xs:element[@name='isFoobar']/xs:complexType

または、xs:complexTypeを、ここで使用している種類のタイプに置き換えます。うまくいけば、それはあなたのprobelmを修正します。

于 2011-04-01T06:24:32.547 に答える