Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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_Inheritance_Namespaces_Jaxb - Fatal编程技术网

Java JAXB继承问题-命名空间损坏

Java JAXB继承问题-命名空间损坏,java,xml,inheritance,namespaces,jaxb,Java,Xml,Inheritance,Namespaces,Jaxb,在使用JAXB将对象编组为xml时,我们面临一个问题。在我们的代码示例中(https://github.com/fbe/JaxbIssueTracker,简单的maven项目,测试用例演示出错的地方)我们有三种类型: 母公司 劫持 混凝土 XSD可以在这里找到: 父类型是抽象的,具体扩展父类型,父类型在序列中引用被劫持的类型。JAXB(xjc)正在从这些xsd文件生成JAVA文件,而没有任何警告或错误消息 编组具体类型时,JAXB将生成以下xml输出: <?xml version="1

在使用JAXB将对象编组为xml时,我们面临一个问题。在我们的代码示例中(https://github.com/fbe/JaxbIssueTracker,简单的maven项目,测试用例演示出错的地方)我们有三种类型:

  • 母公司
  • 劫持
  • 混凝土
XSD可以在这里找到:

父类型是抽象的,具体扩展父类型,父类型在序列中引用被劫持的类型。JAXB(xjc)正在从这些xsd文件生成JAVA文件,而没有任何警告或错误消息

编组具体类型时,JAXB将生成以下xml输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:concreteType xmlns:ns2="http://www.felixbecker.name/parent" xmlns="http://www.felixbecker.name/hijacked" xmlns:ns3="http://www.felixbecker.name/concrete">
    <ns2:hijacked>
        <value>foobar</value>
    </ns2:hijacked>
</ns3:concreteType>

福巴
正如您所看到的,被劫持的类型错误地使用了ns2前缀,该前缀引用了父类型的名称空间,但它应该使用默认名称空间,该名称空间引用了被劫持的名称空间

JAXB无法解组生成的xml,尽管它是通过激活的模式验证自行生成的

这里出了什么问题?xml模式是否已损坏?还是JAXB不能正确处理继承

从parent.xsd中删除抽象属性对面临的问题没有任何影响

任何帮助都将不胜感激!:-)

使用过的版本(均已损坏):

  • 来自JDK1.6的JAXB
  • JAXB-RI 2.2.5
问候,


fbe&ollinux

在您的示例中,
劫持的
元素实际上是在父模式中定义的,因此被放置在“父”命名空间中。这意味着封送文档的名称空间是正确的。如果jaxb能够解封它自己封送的文档,那么对我来说这听起来像个bug

要在正确的名称空间中获取
hijacked
元素,您可以将元素声明移动到
hijacked
模式并使用

<element ref="hijacked:hijacked"/>

在父模式中