java - JAXB - TreeGrid 解决 XmlElement 冲突

标签 java java-8 jaxb java-7

我有这个类结构要序列化 ​​TreeGrid (www.treegrid.com) 对象:

DataGrid.java

@XmlRootElement(name = "Grid")
public class DataGrid implements Serializable {

    private static final long serialVersionUID = 337286974296229101L;

    @XmlElement(name = "Body")
    public DataGridData data = new DataGridData();

    @XmlElement(name = "IO")
    public XmlAttributeHolder io = new XmlAttributeHolder();

    public DataGrid() {

    }
}

DataGridData.java

public class DataGridData {
    @XmlElement(name="B")
    public DataGridCurrentPage currentPage = new DataGridCurrentPage();

    @XmlElement(name="B")
    public List<XmlAttributeHolder> pageList = new ArrayList<XmlAttributeHolder>();
}

这些类将被处理以返回 XML 结构,如下所示:

<Grid>
    <Body>
        <B />
    </Body>
 </Grid>

但是 B 中封装的信息可以不同(因此 DataGridData 类中存在由相同 XmlElement 映射的两个属性)。

如果我在 Java 7 下运行我的项目,那一切都可以,但在 Java 8 下会引发有关冲突的异常,两个属性不能使用相同的 XmlElement 映射。

一个可能的解决方案是:将两个属性封装在两个不同的类中,如下所示:

DataGridData.java

public class DataGridData {
    private DataGridDataCP dataGridDataCP;
    private DataGridDataPL dataGridDataPL;

    public DataGridData() {
        this.dataGridDataCP = new DataGridDataCP();
        this.dataGridDataPL = new DataGridDataPL();
    }

    public DataGridDataCP getDataGridDataCP() {
        return dataGridDataCP;
    }

    public void setDataGridDataCP(DataGridDataCP dataGridDataCP) {
        this.dataGridDataCP = dataGridDataCP;
    }

    public DataGridDataPL getDataGridDataPL() {
        return dataGridDataPL;
    }

    public void setDataGridDataPL(DataGridDataPL dataGridDataPL) {
        this.dataGridDataPL = dataGridDataPL;
    }
}

DataGridDataCP.java

public class DataGridDataCP {

    private DataGridCurrentPage currentPage;

    public DataGridDataCP() {
        this.currentPage = new DataGridCurrentPage();
    }

    @XmlElement(name="B")
    public DataGridCurrentPage getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(DataGridCurrentPage currentPage) {
        this.currentPage = currentPage;
    }
}

DataGridDataPL.java

public class DataGridDataPL {

    private List<XmlAttributeHolder> pageList;

    public DataGridDataPL() {
        this.pageList = new ArrayList<XmlAttributeHolder>();
    }

    @XmlElement(name="B")
    public List<XmlAttributeHolder> getPageList() {
        return pageList;
    }

    public void setPageList(List<XmlAttributeHolder> pageList) {
        this.pageList = pageList;
    }
}

但是这样当 DataGridData类已经序列化,添加标签<dataGridDataCP> (或 <dataGridDataPL> )但我不想显示这个中间标签。

我尝试过 XmlAccessorType用于排除对象的注释 DataGridDataCP/DataGridDataPL但此注释排除了完整的对象(及其封装的属性,而不仅仅是 DataGridData 类中的属性)

最佳答案

你可以尝试一些东西,但你只能正确序列化。反序列化不起作用,我将解释原因。代码看起来像这样:

@XmlAccessorType(XmlAccessType.FIELD)
public class DataGridData {

    @XmlElements({
            @XmlElement(name = "B", type = DataGridCurrentPage.class),
            @XmlElement(name = "B", type = XmlAttributeHolder.class),
    })
    List<Object> values;

}

现在,如果您创建 POJO 并序列化,您将获得所需的 XML。如果这是您的需要,那么您应该没问题。

但是,如果您还想反序列化,由于这两个类都映射到名为“B”的 @XmlElement 中,它将选择一个目标类进行反序列化(我相信是最后指定的)。

关于java - JAXB - TreeGrid 解决 XmlElement 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48946019/

相关文章:

Java7 Bootstrap : Checking class without loading?

Java 流意外结果

java - com.sun.istack.SAXException2 : Instance . .. 正在替换 "java.lang.Object",但是 ... 绑定(bind)到匿名类型

java - 为包含多个带有预先存在的对象的导入模式的模式仅生成唯一的 JAXB 对象

java - 如何对 n 个散列图使用 java 8 合并函数

jaxb - 使用 JAXB 绑定(bind)的类重用不支持 SimpleTypes

java - 如何实现同时包含url和内容的二维码

javac : target release 7 conflicts with default source release 1. 8

java - 如何配置 Jetty 在类更改时重新加载 WebAppContext

Java Spring Data MongoDB 和 Java 8 时间