我有这个类结构要序列化 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/