我有几个像这样的JavaBeans(省略了getter和setter):
@Entity
@XmlRootElement(name = "talent")
public class Talent extends BaseObject implements Serializable {
String gruppe;
String art;
}
和他们的xml文件,都像
<body>
<item>
<gruppe>a</gruppe>
<art>b</art>
</item>
<item>
<gruppe>a</gruppe>
<art>b</art>
</item>
</body>
现在我想将这些xml文件读入我的对象。对于列表,我写了一个通用的包装类,如下所示:
@XmlRootElement(name = "body")
public class GenericWrapper<E extends BaseObject> {
private ArrayList<E> talentListe;
public ArrayList<E> getTalentListe() {
return talentListe;
}
@XmlElement(name = "item")
public void setTalentListe(ArrayList<E> talentListo) {
this.talentListe = talentListo;
}
}
当我想实例化JAXBContext时会出现问题:
JAXBContext context = JAXBContext.newInstance(GenericWrapper.class);
Unmarshaller um = context.createUnmarshaller();
GenericWrapper<Talent> gw = (GenericWrapper<Talent>) um.unmarshal(new FileReader(STORE_FILENAME));
List<Elementar> list = gw.getTalentListe();
然后发生错误消息:
Exception in thread "main" javax.xml.bind.UnmarshalException: Unable to create an instance of struktur.BaseObject
如果我不能使我的包装类通用,一切正常。我想问题是,当我想从我的通用包装类中获取JAXBContext.newInstance时,通用部分没有设置,因此它尝试使用BaseObject中最基本的构造函数,这是抽象的...我怎么告诉生成wrapper.class作为GenericWrapper实例的方法?他使用Talent的构造函数,而不是我的抽象BaseObject。
PS:我确定忘了很多需要的信息。 plz coment,我将提供所需的一切。如果另一个洞似乎更合理,我也愿意倾听。但一般来说,回答这个问题会很好。编辑:BaseObject只是一个MappedSuperclass并且打包了包:
@MappedSuperclass
@PrimaryKeyJoinColumn(name = "colConfig")
public abstract class BaseObject {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
int id;
private String name;
@Column(columnDefinition = "TEXT")
private String beschreibung;
答案 0 :(得分:0)
我们不知道BaseObject或struktur是什么...... https://stackoverflow.com/help/mcve
话虽如此,根据JAXB and abstract classes,您可以尝试仅将impl类注释为@XmlRootElement,将抽象类注释为@XmlTransient