24

次のxjcコマンドを実行すると、エラーが発生します。

$ xjc "ftp://ftp.ncbi.nih.gov/bioproject/Schema/Core.xsd"
parsing a schema...
compiling a schema...
[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 340 of ftp://ftp.ncbi.nih.gov/bioproject/Schema/Core.xsd

[ERROR] (Related to above error) This is the other declaration.   
  line 475 of ftp://ftp.ncbi.nih.gov/bioproject/Schema/Core.xsd

JAXB バインディングと XJC の競合については理解していますが、現在のスキーマのどこが競合しているのかわかりません。

どうすればこれを修正できますか?

ありがとう、

ピエール

更新:エラーのコンテキストは次のとおりです。

$ curl -s "ftp://ftp.ncbi.nih.gov/bioproject/Schema/Core.xsd" | sed 's/^[ \t]*//' | cat -n | egrep -w -A 10 -B 10 '(340|475)' 
   330  <xs:element maxOccurs="1" name="Description"
   331  type="xs:string" minOccurs="0">
   332  <xs:annotation>
   333  <xs:documentation>
   334  Optionally provide description especially when "eOther" is selected
   335  </xs:documentation>
   336  </xs:annotation>
   337  </xs:element>
   338  <xs:element name="BioSampleSet" minOccurs="0" maxOccurs="1"><xs:annotation><xs:documentation>Identifier of the BioSample when known</xs:documentation>
   339  </xs:annotation>
   340  <xs:complexType><xs:sequence><xs:element name="ID" maxOccurs="unbounded" type="xs:token"></xs:element>
   341  </xs:sequence>
   342  </xs:complexType>
   343  </xs:element>
   344  </xs:sequence>
   345  <xs:attribute name="sample_scope" use="required">
   346  <xs:annotation>
   347  <xs:documentation>
   348  The scope and purity of the biological sample used for the study
   349  </xs:documentation>
   350  </xs:annotation>
--
   465  <xs:documentation>Please,  fill Description element when choose "eOther"</xs:documentation>
   466  </xs:annotation>
   467  </xs:enumeration>
   468  </xs:restriction>
   469  </xs:simpleType>
   470  </xs:attribute>
   471  </xs:complexType>
   472  </xs:element>
   473  <xs:element name="TargetBioSampleSet">
   474  <xs:annotation><xs:documentation>Set of Targets references to BioSamples</xs:documentation></xs:annotation>
   475  <xs:complexType>
   476  <xs:sequence>
   477  <xs:element name="ID" type="xs:token" minOccurs="1" maxOccurs="unbounded"></xs:element>                                                 
   478  </xs:sequence>
   479  </xs:complexType>
   480  </xs:element>                        
   481  </xs:choice>
   482  <xs:element name="Method" minOccurs="1">
   483  <xs:annotation>
   484  <xs:documentation>
   485  The core experimental approach used to obtain the data that is submitted to archival databases
4

4 に答える 4

32

ネット上の JAXB に関する最も公式な非公式ガイドから引用します。

スキーマに類似した要素/型名が含まれている場合、「2 つの宣言により ObjectFactory クラスで衝突が発生します」というエラーが発生する可能性があります。より正確に言うと、すべての型と多くの要素 (ファクトリを取得する要素とそうでない要素を正確に説明するのは少し難しい) のそれぞれについて、XJC は同じパッケージ内の ObjectFactory クラスで 1 つのメソッドを生成します。ObjectFactory クラスは、XJC がいくつかのファイルを生成するパッケージごとに作成されます。メソッドの名前は XML 要素/型名から派生し、2 つの要素/型が同じメソッド名を生成しようとすると、エラーが報告されます。

つまり、2 つのオプションがあります。

1 つ目は、このような外部バインディング XML を定義することです。

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  version="1.0">
  <jaxb:bindings schemaLocation="Core.xsd">
    <jaxb:bindings node="//xs:element[@name='BioSampleSet']/xs:complexType">
      <jaxb:factoryMethod name="TypeBioSampleSet"/>
    </jaxb:bindings>
    <jaxb:bindings node="//xs:element[@name='TargetBioSampleSet']/xs:complexType">
      <jaxb:factoryMethod name="TypeTargetBioSampleSet"/>
    </jaxb:bindings>
  </jaxb:bindings>
</jaxb:bindings>

生成されたObjectFactoryクラスでは、 andオブジェクトを生成するために使用できるcreateTypeBioSampleSetandという 2 つのメソッドが作成されcreateTypeTargetBioSampleSetます (JAXB は指定した名前を word に追加します)。createBioSampleSetTargetBioSampleSet

(両方のタイプのバインディングを定義する必要はありません。)

BioSampleSetJAXB が特定のスキーマからクラスを生成することを拒否する理由は正確にはわかりませんが、(たとえば) 1 つのバインディングのみを指定した場合、他のタイプのファクトリ メソッドは次のように命名されcreateTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElseたので、JAXB はこの長いメソッド識別子で窒息したと思います。どういうわけか、両方のタイプに同じものを作成することができました. これは JAXB での実装の詳細だと思います。

他の解決策は、 a の基本型を作成し、BioSampleSetこのように両方の場所で使用することです

<xs:element name="ProjectTypeSubmission">

...

  <xs:element name="Target">

    ...

    <xs:element name="BioSampleSet" type="typeBioSampleSet" minOccurs="0" maxOccurs="1"/>

    ...

  </xs:element>

  ...

  <xs:element name="TargetBioSampleSet" type="typeBioSampleSet"/>

  ...

<xs:element/>

...

<xs:complexType name="typeBioSampleSet">
  <xs:sequence>
    <xs:element name="ID" maxOccurs="unbounded" type="xs:token"></xs:element>
  </xs:sequence>
</xs:complexType>

最善の解決策は、スキーマからすべての匿名型宣言を削除することです。このスキーマは(少なくとも私には)ごちゃごちゃしているように見えるので、それができるならそうしてください。

于 2012-11-18T07:21:53.250 に答える