JAXB没有将xml的任何元素解组为JAXBElement

时间:2011-02-25 20:33:06

标签: java jaxb

我有一个网络服务电话。在我的响应中,当我尝试将xml any元素放入JAXBElement时,它会抛出错误。

在我的架构中:

<xs:complexType name="InputType">
    <xs:annotation></xs:annotation>
    <xs:sequence>           
        <xs:element name="Id" type="xs:string" />
        <xs:any namespace="##any" processContents="lax" minOccurs="0" />
    </xs:sequence>
</xs:complexType>

我正在使用的代码:

Object obj = inputType.getAny();
Object o = ((JAXBElement)obj).getValue(); 

此行会在soap ui中抛出错误:org.apache.xerces.dom.ElementNSImpl incompatible with javax.xml.bind.JAXBElement错误。

为什么不转换为JAXBElement?我如何使它工作?

2 个答案:

答案 0 :(得分:9)

如果使用以下内容对属性进行注释,则内容将映射为DOM节点:

@XmlAnyElement

如果设置了lax = true标志,则已知元素将转换为域对象:

@XmlAnyElement(lax=true)

有关@XmlAnyElement的更多信息,请参阅:


更新#1

使用lax = true,您可以获得域对象和DOM节点的混合。以下是来自java docs:

  

何时为真

     

如果为true,则为元素   匹配标有的属性   JmlAnyElement是JAXBContext已知的   (例如,有一个班级   具有相同标记的XmlRootElement   名称,或者有XmlElementDecl   具有相同的标签名称),.   unmarshaller将热切地解散   这个元素到JAXB对象,   而不是将其解组为DOM。   另外,如果元素是   未知,但它有一个已知的xsi:类型,   unmarshaller急切地解组   JAXBElement的元素,带有   未知的元素名称和   JAXBElement值设置为   JAXB映射的实例   已知xsi:type。

     

结果,在解组后,   财产可以变得多样化;   它可以有DOM节点和一些   JAXB同时对象。


更新#2

最终解决问题:

  1. 由于该属性可能包含DOM节点,因此您的代码应通过执行某些类型检查来解释这种可能性。
  2. 要减少收到的DOM节点数量,您需要将这些片段的可能根元素与Java类相关联。这是通过使用@XmlRootElement(name =“foo”,namespace =“bar”)或@XmlElementDecl注释类来完成的。
  3. 查看我的博客中的一个例子:

答案 1 :(得分:1)

根据您的架构验证您的xml。这应该是第一件要检查的事情