2012-11-16 25 views
17

Chạy sau lệnh XJC đặt ra một lỗi:XJC: Hai tờ khai gây ra một vụ va chạm trong lớp ObjectFactory

$ 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 

Mặc dù tôi hiểu được những cam kết ràng buộc JAXB và những gì đang là mâu thuẫn trong XJC, tôi không hiểu xung đột trong lược đồ hiện tại ở đâu.

cách khắc phục sự cố này?

Cảm ơn,

Pierre

update: đây là bối cảnh của các lỗi:

$ 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

tôi không nghĩ rằng bất kỳ ai cũng có thể giúp bạn nếu bạn không cung cấp các phần liên quan từ Core.xsd – hoaz

Trả lời

24

tôi sẽ báo giá từ the most official unofficial guide on JAXB trên mạng.

Khi schemas chứa tên nguyên tố trai/loại tương tự, họ có thể kết quả trong "Hai tờ khai gây ra một vụ va chạm trong ObjectFactory lớp" lỗi. Để chính xác hơn, đối với mỗi loại và nhiều yếu tố (chính xác những gì các yếu tố có được một nhà máy và những gì không phải là bit khó giải thích), XJC sản xuất một phương pháp trên lớp ObjectFactory trong cùng một gói. Lớp ObjectFactory được tạo cho mỗi gói mà XJC tạo ra một số tệp. Tên của phương thức là bắt nguồn từ tên phần tử/loại XML và lỗi được báo cáo nếu hai yếu tố/loại cố gắng tạo ra cùng một tên phương thức.

Điều đó nói rằng, bạn có hai tùy chọn.

Đầu tiên là để xác định một XML ràng buộc bên ngoài như thế này

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

Trong tạo ObjectFactory lớp này sẽ tạo ra hai phương pháp gọi là createTypeBioSampleSetcreateTypeTargetBioSampleSet (JAXB sẽ nối tên mà bạn chỉ định để từ create) mà có thể được sử dụng để sản xuất các đối tượng BioSampleSetTargetBioSampleSet.

(Đó là không cần thiết để xác định một ràng buộc cho cả loại.)

Tôi không chắc chắn chính xác lý do tại sao JAXB từ chối để tạo ra các lớp học từ sơ đồ nhất định, nhưng khi tôi đã chỉ định chỉ có một ràng buộc (đối với BioSampleSet ví dụ), phương thức nhà máy của loại khác được đặt tên là createTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElse vì vậy tôi nghĩ rằng JAXB đã bị nghẹn về số nhận dạng phương thức dài này, bởi vì bằng cách nào đó nó đã tạo ra cùng một kiểu cho cả hai loại. Tôi nghĩ rằng đây là một số chi tiết thực hiện trong JAXB.

Các giải pháp khác là tạo ra một loại cơ sở cho một BioSampleSet và sử dụng tại cả hai địa điểm như

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

Giải pháp tốt nhất này sẽ được thả mỗi tờ khai loại vô danh từ giản đồ của bạn. Nếu bạn có thể làm điều đó, làm điều đó, bởi vì lược đồ này trông giống như một mớ hỗn độn (với tôi ít nhất).

+0

"Tôi không chắc chắn lý do tại sao JAXB từ chối tạo các lớp từ lược đồ đã cho,": tôi cũng vậy, nhưng cảm ơn bạn rất nhiều, đã làm việc! :-) – Pierre

+0

@ Kohányi Róbert Câu trả lời hay, nó đã giải quyết được vấn đề của tôi. Cảm ơn rất nhiều! – user1516873

+0

Cảm ơn bạn đã tip, chỉ cần tự hỏi tại sao tôi không thể tìm thấy bất kỳ phần tử factoryMethod nào trong lược đồ http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/jaxb/bindingschema_2_0.xsd, mặc dù nó được viết thành https://jaxb.java.net/nonav/2.0/binding-customization/http.java.sun.com.xml.n/index.html – kasi