Java JAXB不将xml任何元素解组到JAXBElement

Java JAXB不将xml任何元素解组到JAXBElement,java,jaxb,Java,Jaxb,我有一个网络服务电话。在我的响应中,当我尝试将xmlany元素放入JAXBElement时,它会抛出一个错误 在模式中,我有: <xs:complexType name="InputType"> <xs:annotation></xs:annotation> <xs:sequence> <xs:element name="Id" type="xs:string" />

我有一个网络服务电话。在我的响应中,当我尝试将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>
此行抛出错误:
org.apache.xerces.dom.ElementNSImpl与soap用户界面中的javax.xml.bind.JAXBElement不兼容


为什么它不隐藏到JAXBElement?如何使其工作?

根据模式验证xml。这应该是要检查的第一件事

如果属性被注释为以下内容,则内容将映射为DOM节点:

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

@XmlAnyElement(lax=true)
有关@XmlAnyElement的更多信息,请参阅:


更新#1

使用lax=true,您可以混合使用域对象和DOM节点。以下内容来自java文档:

为真时

如果为true,则当元素 匹配标记为的属性 XmlAnyElement是JAXBContext已知的 (例如,有一个 具有相同标记的XmlRootElement 名称,或者有XmlElementDecl 具有相同的标记名) 拆封者会急切地拆封 将此元素添加到JAXB对象, 而不是将其解组到DOM。 此外,如果元素是 未知,但它具有已知的xsi:type, 拆封者急切地拆封 将元素添加到JAXBElement,并使用 未知的元素名称和 JAXBElement值设置为 的JAXB映射实例 已知xsi:type

因此,在解组后, 属性可以变得异构; 它可以有DOM节点和一些 JAXB对象同时使用


更新#2

要最终解决问题:

  • 由于该属性可能包含DOM节点,因此代码应该通过执行一些类型检查来考虑这种可能性
  • 为了减少接收到的DOM节点数量,您需要将这些片段的可能根元素与Java类相关联。这是通过使用@XmlRootElement(name=“foo”,namespace=“bar”)或@XmlElementDecl注释类来完成的
  • 请查看我的博客以获取示例:


    在这种情况下,它是lax=true,域对象。但我的问题是,为什么解组会抱怨与JAXBElement对象不兼容。您仍然可以在属性中使用@xmlanyement(lax=true)注释DOM节点。请参阅更新的答案。感谢您提供的信息,我如何从这个getAny()中获取值。解决方法是什么?我再次更新了我的答案,诀窍是使用@XmlRootElement或@XmlElementDecl将这些片段的根元素与Java类关联。感谢您的耐心,但我在@XmlRootElement方面运气不佳,我的大部分代码都是通过工具生成的。我们有一些以前的代码示例,它们没有做任何变通方法,唯一的区别是它们在枚举上下文中,从枚举对象获取任何值,这与我试图实现的概念类似。我正在使用WebSphere6.1和SOAP1.7-JAXB2.0,我想这不是问题。
    @XmlAnyElement(lax=true)