【问题标题】:JAXB inheritance issue - namespace corruptionJAXB 继承问题 - 命名空间损坏
【发布时间】:2012-03-09 13:48:27
【问题描述】:

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

  • 父母
  • 被劫持
  • 混凝土

XSD 可以在这里找到:github

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

当编组具体类型时,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 中删除抽象属性对面临的问题没有任何影响。

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

使用过的版本(都坏了):

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

问候,

fbe & ollinux

【问题讨论】:

    标签: java xml inheritance namespaces jaxb


    【解决方案1】:

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

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

    <element ref="hijacked:hijacked"/>
    

    在父架构中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-07
      • 2018-05-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2017-12-10
      • 2015-02-01
      相关资源
      最近更新 更多