java - JAXB xsd :include and separate packages

原文 标签 java xsd jaxb

我有以下情况:

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

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

从第一个 xsd 开始,在包 (a) 中生成模型。
第二个模式应该为额外的数据创建一个新的包 (b)
类型,但重用生成的包 a.我通过使用解决了这个问题
指向先前生成的元素的绑定(bind)文件(在
包 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 counts of IllegalAnnotationExceptions The element name {http://www.example.org/Scenario/}scenario has more than one mapping



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

最佳答案

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

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

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

关于java - JAXB xsd :include and separate packages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4274482/

相关文章:

xml - 创建一个可以导入到 EXCEL 的 XSD,具有基于元素值的限制

java - 在JDK 1.5中找不到包javax.xml.bind。

java - 以编程方式设置锁定超时Spring Boot JPA

java - 如何减少初始化 Spring 根 WebApplicationContext 的时间?

linux - 适用于Linux/Ubuntu的WSDL浏览器/查看器(gui)

java - 使用 JAXB 从 XMLSchema.xsd 生成 Java 类

json - 如何反序列化 java pojo 类中的 json 对象?

java - PdfBox中的Courier字体?

java - 观察者的构造函数是否需要将Observable作为参数?

c# - 将自定义 WSDL 绑定(bind)到现有 WCF 服务