假设我有三个模式: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”文件。 第二个命令为它引用的每个模式创建了一个新包,然后在每个模式中为它们创建了所有对象类,但是它们都包含错误的包引用,并且它很安静。
我在运行这些命令方面缺少什么?
答案 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文件以防止重新生成类。