MOXY-多个XSD导入相同的模式定义 - 错误:'元素'已定义

时间:2017-06-20 21:32:34

标签: xml xsd jaxb eclipselink moxy

我有3个XSD链接在一起:

schema1.xsd
    imports namespace="x:y:z" schemaLocation= "schemaDefinitions.xsd"
    includes schema2.xsd
schema2.xsd
    imports namespace="x:y:z" schemaLocation= "schemaDefinitions.xsd"
    includes schema3.xsd
schema3.xsd
    imports namespace="x:y:z" schemaLocation= "schemaDefinitions.xsd"

这些xsds由外部源提供,无法更改。

以前我的项目使用标准JAXB和在编译时创建的类。我目前正在切换到动态JAXB MOXY(运行时),现在我的DynamicJAXBContextFactory.createContextFromXSD()行收到以下错误,该行使用schema1.xsd for FileInputStream:

Exception in thread "main" java.lang.ExceptionInInitializerError at 
    TestTool.JavaRoot.TestTools.MainTool.main(MainTool.java:55)
    Caused by: Exception [EclipseLink-50040] (Eclipse Persistence Services - 
    2.6.2.v20151217-774c696): 
    org.eclipse.persistence.exceptions.JAXBException
Exception Description: Error creating DynamicJAXBContext.
    Internal Exception: org.xml.sax.SAXParseException; systemId: 
    file:///public/SITE1/config/schema/SchemaDefinitions.xsd; lineNumber: 
    xyz; columnNumber: xyz; 'xyz' is already defined

我已确定原因是所有三个模式都导入schemaDefinitions.xsd。如果我从schema2和schema3中删除import语句,则会解决错误。以前的jaxb实现不存在此错误,并且自切换到MOXY后xsds没有更改。

问题:

  1. 以这种方式导入/包含xsds是否合法/有效

  2. 由于无法修改XSD,可以解决哪些问题?也许修改绑定xjb文件?

2 个答案:

答案 0 :(得分:1)

另一个回答者可能能够直接帮助重复声明区域中的任何MOXy配置支持,但纯粹是XSD级别:

  1. 不幸的是,W3C XSD建议书允许在多次导入XSD时发生与实现相关的行为。 (参见4.2.3 References to schema components across namespaces
  2. 中的最后一个注释
  3. 根据构建MOXy的基础XSD处理器,您可以设置一个标志以允许/禁止多个导入。对于 Xerces ,请参阅honour-all-schemaLocations;对于 Saxon ,请参阅multipleSchemaImports 1
  4. 另请参阅 Is it an error to import the same XSD multiple times?

    1 注意multipleSchemaImports语义的pending improvement

答案 1 :(得分:1)

通过在MyEntityResolver.java类中添加以下行来关闭错误检查解决了问题:

System.setProperty("com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.noCorrectnessCheck", "true");

我之前在我的主java类中试过这个,显然这是错误的地方!