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

时间:2012-03-09 13:48:28

标签: java xml inheritance namespaces jaxb

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

  • 劫持
  • 混凝土

可在此处找到XSD:github

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

当编组具体类型时,JAXB正在生成以下xml-output:

<?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>

正如你所看到的,hijacked-type错误地使用了引用父类型命名空间的ns2-prefix - 而是应该使用引用被劫持命名空间的默认命名空间。

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

这里出了什么问题? xml架构是否已损坏?或者JAXB无法正确处理继承?

从parent.xsd中删除abstract-attribute对面临的问题没有任何影响。

任何帮助都将受到高度赞赏! : - )

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

  • 来自JDK 1.6的JAXB
  • JAXB-RI 2.2.5

此致

fbe&amp; ollinux

1 个答案:

答案 0 :(得分:0)

在您的示例中,hijacked 元素实际上是在父架构中定义的,因此放在“父”命名空间中。这意味着编组文档的名称空间是正确的。如果jaxb可以解组它自己编组的文档,那么这听起来像是一个bug。

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

<element ref="hijacked:hijacked"/>

在父模式中。