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

发布于 2024-10-19 18:09:14 字数 1872 浏览 5 评论 0原文

我有两个使用 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 不应该创建额外的“create”方法,因为它应该已经在剧集文件中。

I have two schemas which are processed using JAXB. The first schema is preprocessed and information of this is used using an episode file (following http://www.java.net/blog/2006/09/05/separate-compilation-jaxb-ri-21).
The second schema imports the first, and again using jaxb, is processed. This all works as expected.

But now I have an element in the first schema, which is used in the second using a reference.

Schema 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>

Schema 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>

During processing nothing is wrong, but the generated code for both schemas provide the same method:

public JAXBElement<EventType> createType(TypeType value)

At runtime, this results in the following error:

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.

How can I prevent JAXB from creating the duplicate createType methods?

Thanks in advance!

Update: I asked this same question on the JAXB mailing list, on that list I also posted a working example. The thread and example can be found at: http://java.net/projects/jaxb/lists/users/archive/2011-03/message/18

On this list I've been suggested a workaround, and now I can use the schemas the way I like. But I still think JAXB should not create the additional "create" method, since it should already be in the episode file.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黯然 2024-10-26 18:09:14

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

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

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

删除此内容并执行导入... (

请参阅:http://msdn.microsoft .com/en-us/library/ms256480.aspx

I've written a few Schema Definitions in my day. You are declaring your first xsd in your second schema declaration and then you are importing it.

As per MSDN, when you import an XSD you do not include it in the Schema Declaration.
This is where it is in your schema declaration.

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

Remove this and just do the import... ( <xs:import namespace="http://www.example.com/IPO" /> )

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文