带有元素引用的 JAXB 多个模式

Posted

技术标签:

【中文标题】带有元素引用的 JAXB 多个模式【英文标题】:JAXB multiple schemas with element reference 【发布时间】:2011-07-06 12:56:59 【问题描述】:

我有两个使用 JAXB 处理的模式。第一个模式是预处理的,并使用剧集文件(在http://www.java.net/blog/2006/09/05/separate-compilation-jaxb-ri-21 之后)使用其信息。 第二个模式导入第一个,并再次使用 jaxb 进行处理。这一切都按预期工作。

但现在我在第一个模式中有一个元素,在第二个模式中使用引用。

架构 a:

<schema elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:test="http://www.example.org/Test/"
targetNamespace="http://www.example.org/Test/">
<element name="type" type="test:MyType"></element>

架构 b:

<schema elementFormDefault="qualified" 
xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:second="http://www.example.org/Second/"
xmlns:test="http://www.example.org/Test/"
targetNamespace="http://www.example.org/Second/">

<import namespace="http://www.example.org/Test/" />

<complexType name="SomeType">
    <sequence>
        <element ref="test:type" minOccurs="1" maxOccurs="unbounded" />
    </sequence>
</complexType>

在处理过程中没有任何问题,但是为两种模式生成的代码提供了相同的方法:

public JAXBElement<EventType> createType(TypeType value)

在运行时,这会导致以下错误:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of 
    IllegalAnnotationExceptions
The element name http://www.example.org/Type/type has more than one mapping.

如何防止 JAXB 创建重复的 createType 方法?

提前致谢!

更新:我在 JAXB 邮件列表上提出了同样的问题,在该列表上我还发布了一个工作示例。可以在以下位置找到线程和示例:http://java.net/projects/jaxb/lists/users/archive/2011-03/message/18

在此列表中,有人向我建议了一种解决方法,现在我可以按照自己喜欢的方式使用架构。但我仍然认为 JAXB 不应该创建额外的“创建”方法,因为它应该已经在剧集文件中。

【问题讨论】:

你对 xjc 的论据是什么? 对于第二个模式,我使用来自 ant 的 XJC,剧集文件在一个 jar 中,作为参数提供。另外还有一个目录可以映射到第一个模式。这似乎可行,如果我不使用带有情节文件的 jar,则使用第二个模式来生成所有类型。而在我的示例中,只有 createType(TypeType..) 方法是重复的。 请提供完整的架构。 "test:MyType" 是什么定义? 我已经用链接更新了我的问题(以及问题的可用解决方法)。即使我现在可以使用生成的代码,我仍然不明白为什么 jaxb 会创建额外的 ObjectFactory。 软件有错误。我会将案例提交给 JAXB 错误跟踪器。可能会在下一个版本中修复(或记录为一项功能)。 【参考方案1】:

我在这一天写了一些架构定义。您在第二个架构声明中声明了您的第一个 xsd,然后您正在导入它。

根据 MSDN,当您导入 XSD 时,您不会将其包含在架构声明中。 这是它在您的架构声明中的位置。

xmlns:test="http://www.example.org/Test/"

删除它并进行导入... (&lt;xs:import namespace="http://www.example.com/IPO" /&gt;)

见:http://msdn.microsoft.com/en-us/library/ms256480.aspx

【讨论】:

我在 Linux/Java 领域尝试过,xmllint 命令行实用程序和 JAXB xjc 编译器 Ant 任务或多或少地抱怨相同的消息。导入和前缀声明似乎都是必要的。 MSDN 的行为方式不同,这有点令人毛骨悚然。

以上是关于带有元素引用的 JAXB 多个模式的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 jaxb / Maven 生成多个模式包?

使用 JAXB 支持具有微小变化的模式

JAXB 映射到 JSON

是否可以使用 JAXB 从模式映射到 java.util.Map?

iPhone 6 Plus 横向模式下带有标签和固定元素的奇怪错误

如何使用 JAXB 从 XML 模式生成 Java 枚举?