Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅为包含多个导入模式和预先存在的对象的模式生成唯一的JAXB对象_Java_Xml_Jaxb_Xsd - Fatal编程技术网

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

Java 仅为包含多个导入模式和预先存在的对象的模式生成唯一的JAXB对象,java,xml,jaxb,xsd,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代码中为main中包含对common1或common2的引用的元素设置数据时,我当然会得到commo

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

common1和common2已经有了自己的预定义包,其中包含jaxb对象

main.xsd同时导入common1.xsd和common2.xsd

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

Ex) 在我的java代码中:

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

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

编辑
插曲文件似乎是一条出路,所以我尝试了这条路线。 我首先运行命令,使用Blaise的答案提供的命令(但替换了我的文件名/路径)为每个导入的模式生成插曲文件:

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

xjc -d out ProductPurchaseRequest.xsd -extension -b product.episode
第一个命令似乎只是将“product.xsd”的所有类文件生成到我在out参数中指定的位置,而我在任何地方都看不到“product.eption”文件。 第二个命令为它引用的每个模式创建了一个新的包,然后在每个模式中为它们创建了所有的对象类,但是它们都包含了错误的包引用,而且非常混乱


在运行这些命令的过程中,我缺少了什么?

以下是一些可以使用的方法:

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

下面是一个绑定文件示例,它将名为
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模式生成类模型时,可以生成事件文件。然后,当从引用第一个XML模式的另一个XML模式生成类时,可以指向事件文件以防止重新生成类


你好,布莱斯-感谢您的回复。我需要的是插曲文件。在为模式生成JAXB类时,我可以根据需要引用任意多的插曲文件,对吗?@JWiley-是的,您可以根据需要拥有任意多的插曲文件。它们实际上只是外部常规JAXB外部绑定文件。下面是用于指定配置文件的
-b
标志的帮助文本:
指定外部绑定文件(每个文件必须有自己的-b);如果给定一个目录,***.xjb将被搜索
实际上,我可能会提出一个不同的问题,因为它涉及到我在实现解决方案时遇到的一些问题。我尝试了外部绑定文件和插曲,结果好坏参半。谢谢你的帮助布莱斯!
<jxb:bindings schemaLocation="yourSchema.xsd">
    <jxb:bindings node="//xs:complexType[@name='Foo']">
        <jxb:class ref="com.example.Foo"/>
    </jxb:bindings>
</jxb:bindings>