我将引用JAXB 最官方的非官方指南 http://jaxb.java.net/guide/Dealing_with_errors.html#Two_declarations_cause_a_collision_in_the_ObjectFactory_class网络上。
当模式包含相似的元素/类型名称时,它们可以
结果是“两个声明导致 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
类这将创建两个方法称为createTypeBioSampleSet
and createTypeTargetBioSampleSet
(JAXB 会将您指定的名称附加到单词create
)可用于生产BioSampleSet
and TargetBioSampleSet
对象。
(没有必要定义绑定both types.)
我不太确定为什么 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>
最好的解决方案是从架构中删除所有匿名类型声明。如果你能做到这一点,那就去做吧,因为这个模式看起来一团糟(至少对我来说)。