web-dev-qa-db-ja.com

JAXBを使用してXMLSchema.xsdからJavaクラスを生成する

Jaxbを使用してxmlスキーマからJavaクラスを生成しています。スキーマはXMLSchema.xsdをインポートし、そのコンテンツはドキュメントの要素として使用されます。

インポートと「xsd:schema」への参照をそれぞれ削除すると、バインディングコンパイラはクラスを正常に生成します。そうしないと、次のエラーが発生します。これは、JavaクラスをXMLSchema.xsdからのみ生成しようとした場合と同じです!

>  C:\Users\me>"%JAXB%/xjc" -extension -d tmp/uisocketdesc -p uis.jaxb uisocketdesc.xsd -b xml_binding_test.xml -b xml_binding_test_2.xml
-b xml_binding_test_3.xml
parsing a schema...
compiling a schema...

> [ERROR] A class/interface with the same name "uis.jaxb.ComplexType" is already in use. Use a class customization to resolve this conflict.
 line 612 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Relevant to above error) another "ComplexType" is generated from here.
 line 440 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] A class/interface with the same name "uis.jaxb.Attribute" is already in use. Use a class customization to resolve this conflict.
 line 364 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Relevant to above error) another "Attribute" is generated from here.
 line 1020 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] A class/interface with the same name "uis.jaxb.SimpleType" is already in use. Use a class customization to resolve this conflict.
 line 2278 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Relevant to above error) another "SimpleType" is generated from here.
 line 2222 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] A class/interface with the same name "uis.jaxb.Group" is already in use. Use a class customization to resolve this conflict.
 line 930 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Relevant to above error) another "Group" is generated from here.
 line 727 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] A class/interface with the same name "uis.jaxb.AttributeGroup" is already in use. Use a class customization to resolve this conflict.
 line 1062 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Relevant to above error) another "AttributeGroup" is generated from here.
 line 1026 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] A class/interface with the same name "uis.jaxb.Element" is already in use. Use a class customization to resolve this conflict.
 line 721 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Relevant to above error) another "Element" is generated from here.
 line 647 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 1020 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Related to above error) This is the other declaration.
 line 364 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 2278 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Related to above error) This is the other declaration.
 line 2222 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 930 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Related to above error) This is the other declaration.
 line 727 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 440 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Related to above error) This is the other declaration.
 line 612 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 1026 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Related to above error) This is the other declaration.
 line 1062 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 647 of "http://www.w3.org/2001/XMLSchema.xsd"

> [ERROR] (Related to above error) This is the other declaration.
 line 721 of "http://www.w3.org/2001/XMLSchema.xsd"

Failed to produce code.
21

そのようなものと戦うことも、私にとっては大文字と小文字の区別の問題であり、要素と属性の問題と同じ名前です(継承による場合もあります)。 2番目の問題では、次のようなものが含まれている外部バインディングファイルを使用しています。

<jaxb:bindings node="//xs:complexType[@name='AbstractGriddedSurfaceType']//xs:attribute[@name='rows']">
    <jaxb:property name="rowCount"/>
</jaxb:bindings>

大文字と小文字を区別する問題については、xjc引数-XautoNameResolutionを使用できます。Mavenのバージョンは<args><arg>-B-XautoNameResolution</arg></args>、ただしこれはラッパー要素では機能しないため、これらについては上記のようにjaxbのカスタマイズを作成する必要があります。そして、私のように運が悪い場合は、xsdのローカルコピーを使用する必要がある場合があります。重複を手動で修正します。

編集要素の名前を変更するだけでは不十分な、大文字と小文字を区別する問題の別の解決策が見つかりました:

<jaxb:bindings node=".//xs:element[@name='imageDatum'][@type='gml:ImageDatumPropertyType']">
    <jaxb:property name="imageDatumInst"/>
    <jaxb:factoryMethod name="imageDatumInst" />
</jaxb:bindings>

幸運を祈ります。これがお役に立てば幸いです。

18
tomasb

(少なくとも)2つの方法で、JAXBにXMLスキーマxsdのコードを正常に生成させることができます。発生している問題は、一部のスキーマタイプと要素が同じ名前を共有しているという事実から生じています。


最初のオプションは、生成されたクラス名に1つ以上のXML名前変換を適用することにより、名前の競合を回避します。これを行う外部バインディングファイルの例を次に示します。

<jxb:bindings version="2.1"
               xmlns:jxb="http://Java.Sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
               jxb:extensionBindingPrefixes="xjc">  
  <jxb:globalBindings>
    <xjc:simple/>   
  </jxb:globalBindings>   
  <jxb:bindings schemaLocation="XMLSchema.xsd">
    <jxb:schemaBindings>
      <jxb:nameXmlTransform>
        <jxb:elementName suffix="Element"/>
      </jxb:nameXmlTransform>
    </jxb:schemaBindings>
  </jxb:bindings>  
</jxb:bindings>

このアプローチは機能します(同様に機能する他の変換を適用することもできますが、このテクニックはドキュメントで何度も見ました)が、醜い結果を生むと思います。たとえば、この場合はElementElementという名前の生成クラスがあります。


2番目のアプローチは、xjcの出力で示唆されているように、クラスのカスタマイズを使用します。実際、問題のあるクラスの1つを除くすべてのクラスには、対応するスキーマタイプにプロパティabstract="true"が設定されています。したがって、クラス名の前に「Abstract」を付けることは意味があります。つまり、AbstractElementです。残りのAttributeクラスは抽象ではありませんが、attributeという名前のxs:elementは、空の本体を持つ拡張クラスを生成します。したがって、私はそれをBaseAttributeと呼びました。これが私が使用した外部バインディング定義です:

<jxb:bindings version="2.1"
               xmlns:jxb="http://Java.Sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
               jxb:extensionBindingPrefixes="xjc">
  <jxb:globalBindings>
    <xjc:simple/>
  </jxb:globalBindings>
  <jxb:bindings schemaLocation="XMLSchema.xsd">
    <jxb:schemaBindings>
      <jxb:package name="org.w3.xmlschema"/>
    </jxb:schemaBindings>
    <jxb:bindings node="//xs:complexType[@name='complexType']">
      <jxb:class name="AbstractComplexType"/>
    </jxb:bindings> 
    <jxb:bindings node="//xs:complexType[@name='group']">
      <jxb:class name="AbstractGroup"/>
    </jxb:bindings> 
    <jxb:bindings node="//xs:complexType[@name='attributeGroup']">
      <jxb:class name="AbstractAttributeGroup"/>
    </jxb:bindings> 
    <jxb:bindings node="//xs:complexType[@name='simpleType']">
      <jxb:class name="AbstractSimpleType"/>
    </jxb:bindings> 
    <jxb:bindings node="//xs:complexType[@name='element']">
      <jxb:class name="AbstractElement"/>
    </jxb:bindings> 
    <jxb:bindings node="//xs:complexType[@name='attribute']">
      <jxb:class name="BaseAttribute"/>
    </jxb:bindings> 
  </jxb:bindings>
</jxb:bindings>

これにより、生成されたクラス名が明確になり、スキーマが正常にコンパイルされます。


また、別のスキーマのコンパイル中にこの問題が発生した場合に備えて、XMLSchema.xsdに個別のコンパイルを使用し、後で使用するためにjarファイルに保存することをお勧めします。 この質問 への回答は、その方法を説明しています。

9
Keith Layne

スキーマが壊れているようです。 XJCはこれらのことについて極端に好き嫌いがあり、他のツールが通過させることで失敗する可能性があります。

XJCのエラーを調べるよりも、最初に AlphaWorks Schema Quality Checker を使用してスキーマを実行する方が簡単だと思います。これにより、何が問題なのか、人間が読める(開発者が読める)いい出力が得られます。それが問題なく通過できれば、XJCを通過する可能性も高くなります。

4
skaffman

別のオプションは、クラスが異なるパッケージで生成されるように-pオプションを削除することです

4
Christos

Cxfを使用して.wsdlからオブジェクトを生成するときに同じ問題が発生しました。エラーメッセージが示すように、私にとっての解決策は-autoNameResolutionを使用することです。 Maven構成:

         <wsdlOption>
                            <wsdl>${basedir}/test.wsdl</wsdl>
                            <extraargs>
                                <extraarg>-b</extraarg>     
                            <extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>
                                <extraarg>-autoNameResolution</extraarg>
                            </extraargs>
                            <packagenames>
                                <packagename>test.wsdl</packagename>
                            </packagenames>
                        </wsdlOption>
3
blue-sky

同じエラーに遭遇し、削除しました<generatePackage></generatePackage>完全に。これで私の問題は解決しました。

1
Hamid Mohayeji

私は以下を試してみましたが、うまくいきました:

<jxb:bindings schemaLocation="ClaimActivity-ACORD.xsd">
    <jxb:schemaBindings>
        <jxb:package name="x.x.x.x" />
    </jxb:schemaBindings>
    <jxb:bindings node="//xsd:complexType[@name='ConstructionType']">
        <jxb:class name="AbstractConstructionType" />
    </jxb:bindings>
    <jxb:bindings node="//xsd:complexType[@name='ItemDefinitionType']">
        <jxb:class name="AbstractItemDefinitionType" />
    </jxb:bindings>
    <jxb:bindings node="//xsd:complexType[@name='LocationType']">
        <jxb:class name="AbstractLocationType" />
    </jxb:bindings>
    <jxb:bindings node="//xsd:complexType[@name='TaxFeeType']">
        <jxb:class name="AbstractTaxFeeType" />
    </jxb:bindings>
    <jxb:bindings node="//xsd:complexType[@name='DeductibleType']">
        <jxb:class name="AbstractDeductibleType" />
    </jxb:bindings>
    <jxb:bindings node="//xsd:complexType[@name='RegistrationType']">
        <jxb:class name="AbstractRegistrationType" />
    </jxb:bindings>
</jxb:bindings>