JAXB - TreeGrid解决冲突XmlElement

时间:2018-02-23 10:46:08

标签: 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,但此注释会排除整个对象(包含其封装属性,而不仅仅是{{1}中的属性} class)

1 个答案:

答案 0 :(得分:0)

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

@XmlAccessorType(XmlAccessType.FIELD)
public class DataGridData {

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

}

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

但是如果你还想要反序列化,因为这两个类都被映射到名为&#39; B&#39;的@XmlElement。它将选择一个目标类进行反序列化(我相信最后指定的类)。