带有泛型类的JAXBContext.newInstance作为输入

时间:2018-04-16 18:30:18

标签: java xml jaxb

我有几个像这样的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;

1 个答案:

答案 0 :(得分:0)

我们不知道BaseObject或struktur是什么...... https://stackoverflow.com/help/mcve

话虽如此,根据JAXB and abstract classes,您可以尝试仅将impl类注释为@XmlRootElement,将抽象类注释为@XmlTransient