JAXB xsd:包含和单独的包

Ale*_*der 5 java xsd jaxb

我有以下情况:

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

第二个包括第一个,并扩展其中一个类型.此文件中没有定义根类型.

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

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

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

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

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

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

lex*_*ore 6

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

所以我的主要建议是改为使用xsd:import并考虑单独的模式编译方法.

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