[Java] xjc : 두 선언은 ObjectFactory 클래스에서 충돌을 일으킨다.


Answers

그물에있는 JAXB관한 가장 공식적인 비공식 가이드를 인용하겠습니다.

스키마에 비슷한 요소 / 유형 이름이 있으면 "두 개의 선언으로 인해 ObjectFactory 클래스에서 충돌이 발생합니다"라는 오류가 발생할 수 있습니다. 좀 더 정확히 말하자면, 모든 유형과 많은 요소 (정확히 어떤 요소가 팩토리를 얻고 어떤 요소는 설명하기가 까다 롭지 않은지)에 대해 XJC는 동일한 패키지의 ObjectFactory 클래스에서 하나의 메소드를 생성합니다. XJC가 일부 파일을 생성하는 각 패키지에 대해 ObjectFactory 클래스가 생성됩니다. 메소드의 이름은 XML 요소 / 유형 이름에서 파생되며 두 요소 / 유형이 동일한 메소드 이름을 생성하려고 시도하면 오류가보고됩니다.

즉, 두 가지 옵션이 있습니다.

첫 번째는 이와 같이 외부 바인딩 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 클래스에서이 클래스는 createTypeBioSampleSetcreateTypeTargetBioSampleSet 이라는 두 개의 메서드를 만듭니다 (JAXB는 지정한 이름을 create 라는 단어에 추가합니다).이 TargetBioSampleSetBioSampleSetTargetBioSampleSet 개체를 생성하는 데 사용할 수 있습니다.

유형의 바인딩을 정의 할 필요는 없습니다.

JAXB가 주어진 스키마에서 클래스를 생성하는 것을 거부하는 이유는 정확히 모르겠지만, 하나의 바인딩 (예 : BioSampleSet )을 지정하면 다른 유형의 factory 메소드는 createTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElse 와 같은 이름이 createTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElse 따라서 JAXB는이 긴 메소드 식별자 왜냐하면 그것은 어떻게 든 두 가지 유형 모두에 대해 동일한 것을 만들 수 있었기 때문입니다. JAXB의 구현 세부 사항이라고 생각합니다.

다른 해결책은 BioSampleSet 대한 기본 유형을 생성하고 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>

가장 좋은 해결책은 스키마에서 모든 익명 형식 선언을 삭제하는 것입니다. 이 스키마는 혼란스러워 보일 수 있기 때문에 그렇게 할 수 있습니다 (최소한 나에게).

Question

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