gpt4 book ai didi

java - JAXB xsd :include and separate packages

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:34 24 4
gpt4 key购买 nike

我有以下情况:

有 2 个 xsd 文件。第一个定义了一个根元素和几种类型。

第二个包含第一个,并扩展其中一个类型。那里在此文件中没有定义根类型。

从第一个xsd开始,在一个包(a)中生成了一个模型。第二个模式应该为额外的创建一个新包(b)类型,但重用生成的包 a。我通过使用解决了这个问题指向先前生成的元素的绑定(bind)文件(在包一)。到目前为止这是可行的,但是..

JAXB在包A中生成一个ObjectFactory,其中包含一个create根元素的方法。对于第二个模式,还在包 B 中创建了一个 ObjectFactory。并且这个类也有相同根元素的创建方法。

为了能够使用所有类型,使用以下方法创建 jaxb 上下文多个对象工厂 (newInstance(a.ObjectFactory.class, b.ObjectFactory.class))。

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

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions The element name {http://www.example.org/Scenario/}scenario has more than one mapping

我应该以不同的方式生成包吗?或者有什么东西可能使用绑定(bind)文件来防止对象工厂有重复的方法?

最佳答案

首先,重要的是要了解,如果您使用的是 xsd:include 而不是 xsd:import,则不会有两个不同的架构。它是多个文件中的一个模式,将其编译为多个包并诱使 JAXB 组合这些包看起来更像是黑客攻击。

所以我的主要建议是改用xsd:import 并考虑separate schema compilation方法。

如果您想继续使用 xsd:include,您将不得不欺骗 JAXB。例如,您可以删除或调整一个(或两个)ObjectFactory 类,并基于单个类而不是对象工厂构建 JAXB 上下文。您还可以使用 jaxb.in​​dex 代替对象工厂。但这都是黑客行为。

关于java - JAXB xsd :include and separate packages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4274482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com