我有以下情况:
有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有更多 比一个映射
我应该以不同方式生成包吗?或者有什么东西 可能使用绑定文件来阻止对象工厂 有重复的方法?
答案 0 :(得分:6)
首先,重要的是要了解如果您使用xsd:include
而不是xsd:import
,则没有两种不同的模式。它是几个文件中的一个模式,并在几个包中进行编译,并且欺骗JAXB以组合这些包看起来更像是黑客攻击。
因此,我的主要建议是使用xsd:import
代替separate schema compilation方法。
如果你想留在xsd:include
,你将不得不欺骗JAXB。例如,您可以删除或调整ObjectFactory
类中的一个(或两个),并根据各个类而不是对象工厂构建JAXB上下文。您也可以使用jaxb.index
而不是对象工厂。但这都是黑客行为。