【问题标题】:Using XmlRootElement in JAXB to avoid root JAXBElement在 JAXB 中使用 XmlRootElement 来避免根 JAXBElement
【发布时间】:2011-11-30 23:29:47
【问题描述】:

我正在解组符合以下架构的消息,并希望返回的根元素属于 Bar 类。相反,返回的根元素始终是一个 JAXBElement,其中包含名称“foo”,其值等于所需的 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>

【问题讨论】:

  • 谢谢,不过我应该补充一点,我不能更改架构。事实上,这是一个简化的案例,在现实生活中 Bar 是从另一个模式导入的。

标签: jaxb


【解决方案1】:

由于可能有许多全局元素对应于全局复杂类型,因此 JAXB 实现不会在这些类上生成 @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()获取域对象。

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2013-05-11
    • 2015-08-20
    • 2011-05-18
    相关资源
    最近更新 更多