Java JAXB继承问题-命名空间损坏
在使用JAXB将对象编组为xml时,我们面临一个问题。在我们的代码示例中(https://github.com/fbe/JaxbIssueTracker,简单的maven项目,测试用例演示出错的地方)我们有三种类型: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
- 母公司
- 劫持
- 混凝土
<?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"/>
在父模式中