【发布时间】: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