2012-11-16 9 views
17

Ausführen des folgenden xjc Befehl löst einen Fehler:xjc: Zwei Erklärungen verursachen eine Kollision in der Klasse Object

$ 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 

Obwohl ich die JAXB Bindungen und was verstehen sind, ist Konflikt in XJC, ich weiß nicht Verstehen Sie, wo der Konflikt im aktuellen Schema ist.

wie soll ich dieses Problem beheben?

Danke,

Pierre

Update: hier ist der Kontext des Fehlers:

$ 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 
+0

Ich glaube nicht, dass jemand kann Ihnen helfen, wenn Sie relevante Teile von Kern nicht bieten.xsd – hoaz

Antwort

24

ich aus the most official unofficial guide on JAXB im Netz zitieren würde.

Wenn Schemata ähnlich aussehendes Element/Typnamen enthalten, können sie Ergebnis in „Zwei Erklärungen verursachen eine Kollision in der Object Klasse“ Fehler. Um genauer zu sein, für jede aller Art und viele Elemente (genau, welche Elemente eine Fabrik bekommen und was ist nicht gebissen schwierig zu erklären), XJC erzeugt ein Verfahren auf der Object Klasse im gleichen Paket. Die ObjectFactory-Klasse wird für jedes -Paket erstellt, in das XJC einige Dateien generiert. Der Name der Methode ist von XML abgeleiteten Elemente/Typnamen, und der Fehler wird gemeldet, wenn zwei Elemente /types versuchen, die gleichen Verfahrensnamen zu erzeugen.

Das heißt, Sie haben zwei Möglichkeiten.

Die erste ist eine externe Bindung XML ähnliche

<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> 

In der generierten ObjectFactory Klasse zu definieren, diese beiden Methoden schaffen createTypeBioSampleSet und createTypeTargetBioSampleSet genannt (JAXB wird den Namen, den Sie dem Wort angeben anhängen create), dass kann verwendet werden, um BioSampleSet und TargetBioSampleSet Objekte zu produzieren.

(es ist nicht notwendig, eine Bindung für beiden Typen zu definieren.)

Ich bin mir nicht ganz sicher, warum JAXB-Klassen aus dem gegebenen Schema generieren verweigert, aber wenn ich angegeben nur eine Bindung (für BioSampleSet zum Beispiel) dann wurde die Factory-Methode des anderen Typs wie createTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElse benannt, also glaube ich, dass JAXB an dieser langen Methoden-ID erstickt ist, weil es irgendwie gelungen ist, dieselbe für beide Typen zu erzeugen. Ich denke, das ist ein Implementierungsdetail in JAXB.

Die andere Lösung ist es, eine Basistyp für ein BioSampleSet zu erstellen und wie diese

<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> 

die beste Lösung an beiden Standorten verwenden würde alle anonymen Typ Erklärungen von Ihrem Schema zu löschen. Wenn Sie das tun können, tun Sie es, weil dieses Schema (zumindest für mich) wie ein Durcheinander aussieht.

+0

"Ich bin mir nicht ganz sicher, warum JAXB weigert, Klassen aus dem gegebenen Schema zu generieren,": Ich auch nicht, aber vielen Dank, das hat funktioniert! :-) – Pierre

+0

@ Kohányi Róbert Schöne Antwort, es hat mein Problem gelöst. Danke vielmals! – user1516873

+0

Danke für Tipp, nur wundernd, warum ich keine FactoryMethod Element im Schema http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/jaxb/bindingschema_2_0.xsd finden kann, obwohl es in https dokumentiert ist://jaxb.java.net/nonav/2.0/binding-customization/http.java.sun.com.xml.n/index.html – kasi