2010-11-25 57 views
5

我有以下情况:JAXB xsd:包含并单独包

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

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

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

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

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

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

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

我应该产生不同的包?或者有什么 可能使用绑定文件来防止对象工厂从 有重复的方法?

回答

6

首先,重要的是要明白,如果您使用xsd:include而不是xsd:import,则没有两种不同的模式。它是几个文件中的一个模式,并将其编译为多个包,并诱使JAXB将这些包合并在一起看起来更像是黑客行为。

所以我的主要建议是使用xsd:import,而不是考虑separate schema compilation的方法。

如果你想留在xsd:include,你必须欺骗JAXB。例如,您可以删除或调整ObjectFactory类中的一个(或两者),并根据各个类而不是对象工厂构建JAXB上下文。您也可以使用jaxb.index代替对象工厂。但这都是黑客行为。

+0

感谢您的回复。我已经改变它使用导入,而不是包含,确实似乎更好。我会看看博客文章,看起来很有希望。 – Alexander 2010-11-25 13:49:34