Java 输入为泛型类的JAXBContext.newInstance
我有几个像这样的JavaBean(getter和setter省略): 和xml文件,就像Java 输入为泛型类的JAXBContext.newInstance,java,xml,jaxb,Java,Xml,Jaxb,我有几个像这样的JavaBean(getter和setter省略): 和xml文件,就像 <body> <item> <gruppe>a</gruppe> <art>b</art> </item> <item> <gruppe>a</gruppe> <art>b</art&
<body>
<item>
<gruppe>a</gruppe>
<art>b</art>
</item>
<item>
<gruppe>a</gruppe>
<art>b</art>
</item>
</body>
如果我不让我的wrapperclass泛型化,一切都会很好。我想问题是,当我想从我的泛型包装类中获取JAXBContext.newInstance时,泛型部分没有设置,所以它尝试使用BaseObject中最基本的构造函数,它是抽象的。。。如何告诉该方法将wrapper.class生成为GenericWrapper的实例?他使用的是天赋的构造器,而不是我抽象的BaseObject
附言:我肯定我忘了很多需要的信息。请允许,我会提供所需的一切。如果另一个洞看起来更合理,我也愿意听。但总的来说,这个问题的答案会很好
编辑:BaseObject只是一个MappedSuperclass和struktur包:
@MappedSuperclass
@PrimaryKeyJoinColumn(name = "colConfig")
public abstract class BaseObject {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
int id;
private String name;
@Column(columnDefinition = "TEXT")
private String beschreibung;
我们不知道什么是基本物体或结构
话虽如此,根据,您可以尝试将impl类注释为@XmlRootElement,将抽象类注释为@xmltransive,JAXB如何区分应解组的
BaseObject
的哪个子类?这对泛型类不起作用。JAXB不知道您实际上是想让E
成为Talent
。但是,可以设计一个类,该类可以接受列表中BaseObject
的不同子类,只要它们在XML中具有不同的元素名称。让我知道你是否对此感兴趣。@right!这就是问题所在:如果有办法在上下文中告诉JaxB,我的意思是“GenericWrapper.class”。其他元素名称将太麻烦。*如果有办法在上下文中告诉JaxB,我的意思是GenericWrapper.class
-否。因为从技术上讲,没有单独的GenericWrapper.class
.thx来引用帮助。。。我决定反对,认为这不会有多大区别。我加上去了。
@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 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
@MappedSuperclass
@PrimaryKeyJoinColumn(name = "colConfig")
public abstract class BaseObject {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
int id;
private String name;
@Column(columnDefinition = "TEXT")
private String beschreibung;