Java JAXB xsd:包含和单独的包

Java JAXB xsd:包含和单独的包,java,xsd,jaxb,Java,Xsd,Jaxb,我有以下情况: 有2个xsd文件。第一个定义了一个根元素和几个类型 第二个包括第一个,并扩展其中一个类型。那里 此文件中未定义根类型 从第一个xsd开始,在包(a)中生成一个模型。 第二个模式应该为附加的 类型,但重用生成的包a。我用一个简单的方法解决了这个问题 指向先前生成的元素的绑定文件(在 包a)。 到目前为止,这是可行的,但是 JAXB在包a中生成一个ObjectFactory,其中包含一个create 根元素的方法。 对于第二个模式,还将在包B中创建一个ObjectFactory。 这

我有以下情况:

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

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

从第一个xsd开始,在包(a)中生成一个模型。 第二个模式应该为附加的 类型,但重用生成的包a。我用一个简单的方法解决了这个问题 指向先前生成的元素的绑定文件(在 包a)。 到目前为止,这是可行的,但是

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

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

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

com.sun.xml.internal.bind.v2.runtime.illegalannotations异常:2 IllegalAnnotationException的计数 元素名{http://www.example.org/Scenario/}这个场景有更多的内容 多个映射

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

首先,重要的是要理解,如果您使用的是
xsd:include
而不是
xsd:import
,那么就没有两种不同的模式。它是多个文件中的一个模式,并在多个包中编译它,然后欺骗JAXB组合这些包看起来更像是黑客行为

我的主要建议是使用<代码> xSD:导入< /COD>,并考虑方法。


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

谢谢你的回复。我已经将它改为使用import而不是include,看起来确实更好。我会看看这篇博文,到目前为止似乎很有希望。这解决了我的问题。谢谢你的链接,我已经搜索了好几天了使用import而不是include可能适用于这种特殊情况,但在使用import时(如果使用对象引用),也会出现包含重复方法的ObjectFactory的完全相同的问题。见: