如何使用JAXB注释将父类中的元素更改为派生类中的属性?

时间:2014-09-18 09:21:25

标签: java xml serialization jaxb annotations

我希望XML元素看起来像这样:

<xmlObject id="11111111-1111-1111-1111-111111111111" />

我遇到了需要编组对象的情况。我的基础对象如下所示:

public class MyObject {
    private UUID id;
    public UUID getId() { return id; }
    public void setId(UUID value) { id = value; }
}

我希望将id作为对象的属性而不是元素,但我不想在MyObject中进行,因为我觉得这个类不应该知道如何用XML表示自己。我有以下课程,意在做整个'id as an attribute'魔术;我还将对象表示为一个名为'xmlObject'的元素:

@XmlRootElement("xmlObject")
public class MyXmlObject extends MyObject {
    @Override
    @XmlAttribute(name = "id")
    public void setId(UUID value) { id = value; }
}

这种尝试有点成功,如下面的结果所示:

<xmlObject id="11111111-1111-1111-1111-111111111111">
    <id>11111111-1111-1111-1111-111111111111</id>
</xmlObject>

id现在是一个属性,但它仍然是一个元素!我试图通过添加XmlAccessorType注释来删除元素,只允许JAXB识别带注释的字段/属性,但这不起作用,因为id仍然被写为元素:

@XmlAccessorType(value = XmlAccessType.NONE)
@XmlRootElement("xmlObject")
public class MyXmlObject ...

如果我将注释放在父类(MyObject)上,则id不再是元素,但正如我之前提到的,我希望避免将注释放在MyObject上。有没有办法实现我想做的事情?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了你想要的东西,你可以使用包装器来注释你的主要对象。

一个例子。

您不想注释的主要对象:

public class User {

    private String userName;
    private String userSurname;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserSurname() {
        return userSurname;
    }

    public void setUserSurname(String userSurname) {
        this.userSurname = userSurname;
    }

}

将被注释的包装器对象:

@XmlRootElement(name = "xmlUser")
class UserWrapper {

    private User user;

    public UserWrapper() {
    }

    public UserWrapper(User user) {
        this.user = user;
    }

    @XmlAttribute(name = "name")
    public String getUserName() {
        return user.getUserName();
    }

    @XmlElement(name = "surname")
    public String getUserSurname() {
        return user.getUserSurname();
    }

}

这里唯一的事情是你必须从主要对象覆盖你的getter,你想要注释它。

Marshaller示例:

public class Starter {

    public static void main(String[] args) {
        User user = new User();
        user.setUserName("Name");
        user.setUserSurname("Surname");

        UserWrapper userWrapper = new UserWrapper(user);

        try {
            JAXBContext context = JAXBContext.newInstance(UserWrapper.class);
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            m.marshal(userWrapper, System.out);

        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

}

结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlUser name="Name">
    <surname>Surname</surname>
</xmlUser>