JAXB Marshaling将XML数据加倍

时间:2014-07-30 14:23:02

标签: java jaxb marshalling

当我保存2个对象时,实际上保存了4个(加倍)。得到对象A和B,而不是输出XML文件保存AB我得到XML在哪里是ABAB。

我的课程:

public class Uzivatel {
    private String meno;
    private String heslo;
    private Boolean admin;
    public Uzivatel() {
        super();
    }
    public Uzivatel(String meno, String heslo,
        Boolean admin) {
        super();
        this.meno = meno;
        this.heslo = heslo;
        this.admin = admin;
    }
}

这是包装器:

@XmlRootElement(name = "Data")
public class Wrapper {
    @XmlElement(name = "uzivatel")
    private List<Uzivatel> uzi = new ArrayList<Uzivatel>();

    public List<Uzivatel> getUzivatel() {
        return uzi;
    }

    public void setUzivatel(List<Uzivatel> uzi) {
        this.uzi = uzi;
    }



}

这是main-app中使用的方法:

public void savePersonDataToFile() {
    try {
        JAXBContext context = JAXBContext
                .newInstance(Wrapper.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        Wrapper wrapper = new Wrapper();
        for(int i=0;i<uzivatelia.size();i++){
            wrapper.getUzivatel().add(uzivatelia.get(i));
        }
        m.marshal(wrapper, new File("data.xml"));
    } catch (Exception e) { // catches ANY exception
        Dialogs.create().title("Error")
                .masthead("Could not save data to file:\n")
                .showException(e);
    }
}

我的输出是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Data>
<uzivatel>
    <admin>true</admin>
    <heslo>admin</heslo>
    <meno>admin</meno>
</uzivatel>
<uzivatel>
    <admin>false</admin>
    <heslo>user</heslo>
    <meno>user</meno>
</uzivatel>
<uzivatel>
    <admin>true</admin>
    <heslo>admin</heslo>
    <meno>admin</meno>
</uzivatel>
<uzivatel>
    <admin>false</admin>
    <heslo>user</heslo>
    <meno>user</meno>
</uzivatel>
</Data>

但应该是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Data>
<uzivatel>
    <admin>true</admin>
    <heslo>admin</heslo>
    <meno>admin</meno>
</uzivatel>
<uzivatel>
    <admin>false</admin>
    <heslo>user</heslo>
    <meno>user</meno>
</uzivatel>
</Data>

你能帮我搞清楚吗?

1 个答案:

答案 0 :(得分:0)

我认为Wrapper上的注释是问题所在。因为您使用XmlElement显式地注释私有成员,所以实际上是从私有成员和公共getter / setter方法获取输出。

如果您要使用字段级访问权限,请使用Wrapper注释@XmlAccessorType(XmlAccessType.FIELD)类。否则,将您的XmlElement注释移动到getter方法。