当前位置: 首页 > 面试题库 >

xjc:两个声明导致ObjectFactory类发生冲突

苍烨然
2023-03-14
问题内容

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

问题答案:

我将引用网上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)可用于生成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>

最好的解决方案是从架构中删除所有匿名类型声明。如果可以的话,请这样做,因为这种模式看起来很混乱(至少对我而言)。



 类似资料:
  • 问题内容: 尝试用于为SOAP端点生成客户端。WSDL和所有使用的XSD文件都是本地副本。 这是正在执行的命令: 出现此错误: 请注意,行号与报告的冲突相同。 这是模式: 我试过删除类型定义,但在其他许多地方都引用了它。 任何人都可以就如何使其正常工作提供任何建议吗? 谢谢 编辑: WSDL导入这些模式的行如下: 问题答案: 感谢@Petru Gardea的帮助,我最终通过将软件包规范省略为wsi

  • 问题内容: 我正在使用Java 6,JaxB 2和SpringSource Tool Suite(与Eclipse相同)。我编写了一些Java类,使用JaxB从中生成XML模式。但是,我注意到为了使用JaxB从Java对象生成XML文档的功能,我需要一个ObjectFactory。 如何生成ObjectFactory而不会浪费我现在已有的类? 问题答案: 更新 这个问题可能指的是创建一个角色的作用

  • 10.4. 导入声明 可以在一个Go语言源文件包声明语句之后,其它非导入声明语句之前,包含零到多个导入包声明语句。每个导入声明可以单独指定一个导入路径,也可以通过圆括号同时导入多个导入路径。下面两个导入形式是等价的,但是第二种形式更为常见。 import "fmt" import "os" import ( "fmt" "os" ) 导入的包之间可以通过添加空行来分组;通常将来

  • var remember bool = false if something { remember := true //错误 } // 使用remember 在此代码段中,remember变量永远不会在if语句外面变成true,如果something为true,由于使用了短声明:=,if语句内部的新变量remember将覆盖外面的remember变量,并且该变量的值为true,但是在if语

  • 问题内容: 对我的头衔表示歉意,我无法正确表达问题。 我已经看到有两种实现方式。首先通过表示您的类已实现来完成。第二个任务是让您自己声明完成任务。 为什么在第一种选择中,您可以简单地将其作为参数,而在第二种选择中,则必须麻烦自己创建对象? 首先: 第二: 问题答案: 在第一种方法中, 整个Activity类都 实现了该接口。您可以将每个View的设置 为此 ,并通过一种方法接收所有click事件,

  • 致谢 本手册是在原来尚未完成的“Apache 2.0手册中文版翻译项目”的基础上,根据新的 Apache 2.2 文档进行修订、更新、补充的结果,没有他们之前辛勤劳动积累的成果,单靠一人之力是很难完成的[目前尚有部分未翻译]。所以首先应当感谢那个项目的各位自愿者:kajaa 、biAji 、fei 、suncjs 、Daniel 、flytosea 、forehead 。 感谢http://www