仅为包含具有预先存在的对象的多个导入模式的模式生成唯一的JAXB对象

时间:2014-02-05 19:14:16

标签: java xml jaxb xsd

假设我有三个模式:main.xsd,common1.xsd和common2.xsd。

common1和common2已经拥有自己的包含jaxb对象的预定义包。

main.xsd导入common1.xsd和common2.xsd。

当我尝试为main.xsd生成jaxb对象时,它当然会生成它通过common1和common2引用的所有对象,但是会生成导致我的问题的包main。现在,当我尝试将数据设置为包含java代码中对common1或common2的引用的main元素时,我当然会得到common1.element与main.element不匹配的错误。

例) 在我的java代码中:

common1.ObjectFactory.getExData()将返回common.ExData。 main.setExData(ExDataType exampleData)将期望包main中的ExDataType。 但我从common1中的ObjectFactory获取此数据,因此它引用common1.ExDataType

我的问题是,我如何以不会复制主包中创建的类型的方式为main生成这些对象,而是引用现有的common1或common2对象?

修改
剧集文件似乎是要走的路,所以我尝试了这条路线。 我首先运行命令,使用Blaise的答案提供的命令为每个导入的模式生成剧集文件(但我的文件名/路径被替换):

xjc -d out -episode product.episode Product.xsd

然后我尝试运行该命令,使用下一个命令为包含这些导入的模式生成JAXB类:

xjc -d out ProductPurchaseRequest.xsd -extension -b product.episode

第一个命令似乎只生成了我在out参数中指定的“product.xsd”的所有类文件,并且我没有在任何地方看到“product.episode”文件。 第二个命令为它引用的每个模式创建了一个新包,然后在每个模式中为它们创建了所有对象类,但是它们都包含错误的包引用,并且它很安静。

我在运行这些命令方面缺少什么?

1 个答案:

答案 0 :(得分:2)

以下是您可以使用的几种方法:

使用外部绑定文件指定与现有类对应的复杂类型

下面是一个示例绑定文件,它将名为Foo的复杂类型与现有的类com.example.Foo相关联:

<jxb:bindings schemaLocation="yourSchema.xsd">
    <jxb:bindings node="//xs:complexType[@name='Foo']">
        <jxb:class ref="com.example.Foo"/>
    </jxb:bindings>
</jxb:bindings>

使用剧集文件

如果您有很多课程,上述过程非常耗费人力。相反,您可以利用剧集文件。在从XML Schema生成类模型时,可以生成Episode文件。然后,当您从另一个引用第一个XML Schema的XML Schema生成类时,您可以指向episode文件以防止重新生成类。