我的班级层次结构:
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class GenericItem {
@XmlElement(name = "Id", required = true)
private String itemId;
////other fields
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Item extends GenericItem {
@XmlElement(name = "AreaType", required = true)
private String areaType;
///other fields
}
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class GenericData<T extends GenericItem>{
@XmlElement(name = "Item")
private List<T> itemList;
public List<T> getItemList() {
return itemList;
}
public void setItemList(List<T> itemList) {
this.itemList = itemList;
}
////other fields
}
@XmlRootElement(name = "Data")
@XmlAccessorType(XmlAccessType.FIELD)
public class Data extends GenericData<Item> {
////other fields
}
当我尝试取消看起来像
的XML文档时 <Data>
<Item/>
<Item/>
</Date>
我有错误 javax.xml.bind.UnmarshalException - 包含链接异常: [com.sun.istack.SAXParseException2;无法创建GenericItem的实例]
JAXBContext jc = JAXBContext.newInstance(Data.class, GenericData.class,Item.class, GenericItem.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
--error here--> JAXBElement<Data> jb = unmarshaller.unmarshal(xmlStreamReader, Data.class);
请,我需要帮助:(
答案 0 :(得分:1)
作为解决方法,删除抽象关键字并尝试使用泛型类。
list of java classes to be recognized by the new JAXBContext.
这是文档针对 classesToBeBound 参数所说的内容,它表示它应该能够创建一个新对象来识别参数。在抽象类的情况下,它是不可能的。
尝试使用@MappedSuperclass
和@XmlSeeAlso
的组合。用这些注释基类并将它们抽象化。