为什么JAXB有时会映射到JAXBElement?

在非官方指南中有一个占位符回答,其中包含一篇文章链接(对我而言)似乎非常不相关。

我使用XJC生成我的JAXB类,虽然它们中的大多数按预期映射到彼此,但是一些元素被映射到JAXBElement 。 这对于具有循环的图来说是最烦人的,其中有时Foo元素的父节点将是JAXBElement ,它本身不具有父属性,从而打破了循环。

我可以想到各种解决方法,但如果有人能够向我解释这种行为会更好。 为什么JAXB有时将元素映射到JAXBElement而不是Foo?

JAXBElement用于在对象模型中不存在足够信息的用例中保留元素名称/命名空间。 最常见的是替代组:

与替代组织:

             

会产生:

 package org.example; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "anElement" }) @XmlRootElement(name = "root") public class Root { @XmlElementRef(name = "anElement", namespace = "http://www.example.org", type = JAXBElement.class) protected JAXBElement anElement; public JAXBElement getAnElement() { return anElement; } public void setAnElement(JAXBElement value) { this.anElement = ((JAXBElement ) value); } } 

没有替换组:

如果删除替换组:

            

将生成以下类:

 package org.example; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "anElement" }) @XmlRootElement(name = "root") public class Root { @XmlElement(required = true) protected String anElement; public String getAnElement() { return anElement; } public void setAnElement(String value) { this.anElement = value; } } 

您可以在解组时获取JAXBElement,比较以下示例:

  • 如果没有任何JAXB元数据,结果将被包装在JAXBElement中
  • 使用@XmlRootElement可以消除根级JAXBElement

为了避免映射到JAXBElement? 我做过这件事对我有用:

          

将此文件保存在xml文件中并作为绑定文件提供。

参考链接

使用eclipse生成JAXB类不要忘记给出使用上面的xml创建的绑定文件,并选中“允许供应商扩展”,如下所示:

在此处输入图像描述

通过更改,我可以在生成的xjc类中删除JAXBElement,以便将xsd转换为JAXB生成的类。