Pie*_*rre 20 java schema binding xsd xjc
运行以下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
Run Code Online (Sandbox Code Playgroud)
虽然我理解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
Run Code Online (Sandbox Code Playgroud)
Koh*_*ert 27
我将引用网上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>
Run Code Online (Sandbox Code Playgroud)
在生成的ObjectFactory类中,这将创建两个名为createTypeBioSampleSetand的方法createTypeTargetBioSampleSet(JAXB将附加您指定给该单词的名称create),该方法可用于生成BioSampleSet和TargetBioSampleSet对象.
(没有必要为两种类型定义绑定.)
我不确定为什么JAXB拒绝从给定的模式生成类,但是当我只指定一个绑定(BioSampleSet例如)时,另一个类型的工厂方法被命名为,createTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElse所以我认为JAXB对这个长方法标识符感到窒息,因为它以某种方式设法为这两种类型创建相同的一个.我认为这是JAXB中的一些实现细节.
另一个解决方案是为a创建一个基本类型,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>
Run Code Online (Sandbox Code Playgroud)
最好的解决方案是从模式中删除每个匿名类型声明.如果你能做到这一点,那就去做吧,因为这个架构看起来像一团糟(至少对我来说).
删除命令中的-p包
xjc -d src -XautoNameResolution TFMData_Service.xsd
Run Code Online (Sandbox Code Playgroud)