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

Java 如何将父类中的元素更改为带有JAXB注释的派生类中的属性?,java,xml,serialization,jaxb,annotations,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元素如下所示:

<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作为属性”的魔术;我还将对象表示为一个名为“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>

如果我将注释放在父类(
MyObject
)上,则id不再是元素,但正如我前面提到的,我希望避免将注释放在
MyObject
上。有什么方法可以实现我想做的吗?

如果我正确理解了您想要的内容,您可以使用包装器来不注释您的主要对象

举个例子

不希望注释的主对象:

将被注释的包装器对象:

这里唯一的一件事是,您必须重写主对象中的getter,您希望对其进行注释

马歇尔勒示例:

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>

谢谢,我没有考虑过简单地包装对象。我会试试看,看看会怎么样。
@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();
    }

}
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>