2012-03-09 89 views
0

当使用JAXB将对象编组为xml时,我们正面临一个问题。在我们的代码示例(https://github.com/fbe/JaxbIssueTracker,简单的Maven项目,测试案例证明了什么错误),我们有三种类型:JAXB继承问题 - 命名空间损坏

  • 劫持
  • 具体

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中删除abstract-attribute对面临的问题没有任何影响。

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

用于版本(均断开):

  • JAXB从JDK 1.6
  • JAXB-RI 2.2.5

问候,

FBE & ollinux

回答

0

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

要获得正确的命名空间,你可以将元素声明移到hijacked模式和父模式使用

<element ref="hijacked:hijacked"/> 

hijacked元素。