在JAXB中使用XmlRootElement避免根JAXBElement

在JAXB中使用XmlRootElement避免根JAXBElement,jaxb,Jaxb,我正在解组符合下面模式的消息,并希望返回的根元素为Bar类。相反,返回的根元素始终是包含名称“foo”的JAXBElement,其值等于所需的Bar元素 我认为可以在绑定文件中使用XmlRootElement来实现这一点,但还没有实现。有什么想法吗 <xsd:element name="foo" type="Bar"/> <xsd:complexType name="Bar"> <xsd:sequence> <xsd:elemen

我正在解组符合下面模式的消息,并希望返回的根元素为Bar类。相反,返回的根元素始终是包含名称“foo”的JAXBElement,其值等于所需的Bar元素

我认为可以在绑定文件中使用XmlRootElement来实现这一点,但还没有实现。有什么想法吗

<xsd:element name="foo" type="Bar"/>
<xsd:complexType name="Bar">
    <xsd:sequence>
        <xsd:element name="goo" type="xsd:string"/>
    </xsd:sequence>
</xsd:complexType>

由于可能有许多全局元素对应于全局复杂类型,因此JAXB impl不会在这些类上生成
@XmlRootElement
注释。可以使用匿名复杂类型声明元素

<xsd:element name="foo">
    <xsd:complexType>
        <xsd:sequence>
           <xsd:element name="goo" type="xsd:string"/>
      </xsd:sequence>
    </xsd:complexType>
</xsd:element>


unmarshal
方法返回
JAXBElement
的实例时,您可以通过调用
getValue()

来获取域对象,您可以使用
jaxb:class
自定义
xsd:element
,这将为您的元素生成一个额外的类。此自定义可通过绑定完成:

<jaxb:bindings node="xsd:element[@name='foo']">
    <jaxb:class>
</jaxb:bindings>


谢谢,不过我应该补充一点,我不能更改模式。事实上,这是一个简化的案例,在现实生活中,Bar是从另一个模式导入的。感谢Blaise,这是可行的,但我正在寻找一个不改变模式的解决方案。可能吗?@EwanB-以下内容可能会有所帮助: