我有一个网络服务电话.在我的响应中,当我尝试将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>
Run Code Online (Sandbox Code Playgroud)
我正在使用的代码:
Object obj = inputType.getAny();
Object o = ((JAXBElement)obj).getValue();
Run Code Online (Sandbox Code Playgroud)
这行引发了错误:org.apache.xerces.dom.ElementNSImpl incompatible with javax.xml.bind.JAXBElementsoap ui中的错误.
为什么它不转换为JAXBElement?我如何使其工作?
如果使用以下内容对属性进行批注,则内容将映射为DOM节点:
@XmlAnyElement
Run Code Online (Sandbox Code Playgroud)
如果设置了lax = true标志,则已知元素将转换为域对象:
@XmlAnyElement(lax=true)
Run Code Online (Sandbox Code Playgroud)
有关@XmlAnyElement的更多信息,请参阅:
更新#1
使用lax = true,您可以获得域对象和DOM节点的混合.以下是来自java文档:
当真的
如果为true,当一个元素与标记为XmlAnyElement的属性匹配时,JAXBContext就知道了(例如,有一个具有相同标记名称的XmlRootElement的类,或者具有相同标记名称的XmlElementDecl),unmarshaller将急切地解组此元素到JAXB对象,而不是将其解组为DOM.此外,如果元素未知但它具有已知的xsi:类型,则unmarshaller急切地将元素解组为JAXBElement,其中未知元素名称和JAXBElement值设置为已知xsi:类型的JAXB映射的实例.
结果,在解组后,财产可能变得异质; 它可以同时拥有DOM节点和一些JAXB对象.
更新#2
最终解决问题:
查看我的博客中的示例: