JAXB xsd:包含和单独的包

时间:2010-11-25 07:05:37

标签: java xsd jaxb

我有以下情况:

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

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

从第一个xsd开始,在包(a)中生成模型。 第二个模式应为附加模块创建一个新包(b) 类型,但重用生成的包a。我用一个来解决这个问题 绑定文件,指向先前生成的元素(in 包a)。 到目前为止,这是有效的,但是..

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

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

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

  

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:2   IllegalAnnotationExceptions的计数   元素名称{http://www.example.org/Scenario/}scenario有更多   比一个映射

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

1 个答案:

答案 0 :(得分:6)

首先,重要的是要了解如果您使用xsd:include而不是xsd:import,则没有两种不同的模式。它是几个文件中的一个模式,并在几个包中进行编译,并且欺骗JAXB以组合这些包看起来更像是黑客攻击。

因此,我的主要建议是使用xsd:import代替separate schema compilation方法。

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