XJC:两个声明引起ObjectFactory类碰撞(xjc: Two declarations c

2019-07-03 21:22发布

运行以下命令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

Answer 1:

我会从报价上JAXB最官方的非官方指南在网上。

当架构包含容貌相似元素/类型名称,它们可能会导致“两个声明引起ObjectFactory类碰撞”的错误。 更精确地说,对于每一个所有类型的许多元素(到底是什么因素让一个工厂,什么不能是有点棘手解释)的,XJC产生在同一封装ObjectFactory类的一种方法。 ObjectFactory类是为每个XJC产生一些文件放入包中创建。 该方法的名称是从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 ),可用于生产BioSampleSetTargetBioSampleSet对象。

(这是没有必要界定这两种类型的绑定。)

我不知道是什么原因JAXB拒绝产生从给定的架构类,但是当我指定了一个绑定(用于BioSampleSet为例)然后其他类型的工厂方法被命名为喜欢createTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElse所以我觉得JAXB哽咽着对这个长方法标识符,因为它在某种程度上成功地创建一个相同的两种类型。 我认为这是JAXB一些实现细节。

另一种解决方案是一种用于创建一个基本类型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>

最好的解决办法是每一个匿名类型声明从您的架构下降。 如果你能做到这一点,做到这一点,因为该模式(至少对我来说)看起来像一个烂摊子。



文章来源: xjc: Two declarations cause a collision in the ObjectFactory class