我有一个网络服务电话。在我的响应中,当我尝试将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?我如何使它工作?
答案 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 :(得分:1)
根据您的架构验证您的xml。这应该是第一件要检查的事情