2011-10-24 8 views
9

これは私を狂ってしまいます。私はWSDL最初のクライアントを構築していてwsimportのが次のエラーWSDLの設定が不適切なJAXBのカスタマイズ

[ERROR] Complex type and its child element share the same name "DomainsMap". 
Use a class customization to resolve this conflict. 
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl 

1)私は、このWSDLを制御することはできませんが投げているので、カスタマイズが必要なWSDL内に埋め込まれたスキーマを持っていると私はそれが改正の上に行くことを期待します正式な相談や釈放なし。 2)自動化されたビルドチェーンにスタブの構築を含める必要があるため、この命名の衝突を手動で修正することはできません。

外部のカスタマイズファイルを使用する必要があります。私は、カスタマイズを動作させる方法を理解していないようです。ここで

は、問題のあるWSDLフラグメントである:

<wsdl:definitions> 
    <wsdl:types> 
     <xs:schema> 
     . 
     . 
     . 
     <xs:complexType final="extension restriction" name="domainsMap"> 
     <xs:sequence> 
      <xs:element name="domainsMap"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element maxOccurs="unbounded" minOccurs="0" name="entry"> 
        <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="key" type="xs:string"/> 
         <xs:element minOccurs="0" name="value" type="tns:domainValueMap"/> 
        </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 

これはあなたのJAXBのスキルを曲げるための絶好のチャンスとなります。どんな助けでも大歓迎です。

私は何時間もjaxbのドキュメントを見てきましたが、まだ運がありません。必要に応じてWSDL全体を提供することができます。誰も助けることができますか?

答えて

16

今朝私は仕事にやって来て、これを理解することができました。時には問題から離れて新鮮な頭を戻すことが最善の方法です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<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:xs="http://www.w3.org/2001/XMLSchema" 
    wsdlLocation="ArtesiaWebServices.wsdl"> 

    <enableWrapperStyle>true</enableWrapperStyle> 
    <enableAsyncMapping>false</enableAsyncMapping> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType"> 
     <!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainsMapElement"/> 
    </jaxws:bindings> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType"> 
     <!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainValueMapElement"/> 
    </jaxws:bindings> 
</jaxws:bindings> 

上記の外部バインディングファイルは、次のコマンドでwsimportツールで使用します。このバインディングファイルについて

重要なもの:JAXWSバインディングの

  • 名前空間が使用されています。これは、ノード選択が正しく動作するようにする唯一の方法です。
  • ノードの選択は、/ xs:complexTypeで終わる必要があります。要素名を選択するのをやめると、コンパイラはエラーを生成します。 -dがは、出力ディレクトリ(この場合は '生成' という名前のフォルダ)を指定し、生成

    wsimportの使用生成-keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

オプションを-d
-b ArtesiaExternalBinding.xmlは、バインディングファイルを使用するようにJAXBコンパイラに指示します。 java.net documents on jaxws customizations

これはネストに私を導くものです:
-keep

は最終的に、私は、これは情報の最も有用ちらほらあることが判明し(私は検査のためにスタブを使用)スタブを保ちますjaxwsタグ内のjaxbカスタマイズ。リンクありがとうPetru Gardea

+1

最後に!ありがとうございました!それは私の問題を解決しました.. – fachexot

+4

SOAP ....あまりにも多くの無駄な人の時間 – dolbysurnd

+0

Far out ...これは、mavenプラグインの中で 'wsimport'を使うとき、魔法の' jaxws'タグなしではうまくいきません。ありがとう。 – Strelok

3

あなたがしようとしたか、いませんでした何明らかではないが、私は次の操作を行います: - wsimportのコマンドラインで-bオプションを利用する(利用可能なDOC here)。 - バインディングファイルの情報はhereです。 - 名前の衝突を避けるためにカスタマイズする方法の例を示す詳細な図はhereです。私はここに抜粋を提供しています - あなたの問題を解決するはずです。

<jxb:schemaBindings> 
     <jxb:package name="primer.myPo"> 
     <jxb:javadoc> 
    <![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]> 
     </jxb:javadoc> 
     </jxb:package> 
     <jxb:nameXmlTransform> 
      <jxb:elementName suffix="Element"/> 
     </jxb:nameXmlTransform> 
</jxb:schemaBindings> 
+1

申し訳ありませんが、私はあなたがここに添付したリンクをたどると思います。 「これらのJAXBバインディングは、スキーマ内またはjaxws:bindings要素の子として使用できます」というステートメントに固定されています。 –

関連する問題