我将引用网上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类中,这将创建两个称为
createTypeBioSampleSet和的方法
createTypeTargetBioSampleSet(JAXB会将您指定的名称附加到word上
create)可用于生成
BioSampleSet和
TargetBioSampleSet对象。
(不必为 这两种 类型 都 定义一个绑定。)
我不确定为什么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>
最好的解决方案是从架构中删除所有匿名类型声明。如果可以的话,请这样做,因为这种模式看起来很混乱(至少对我而言)。



