Java 如何将父类中的元素更改为带有JAXB注释的派生类中的属性?
我希望XML元素如下所示: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中这样做
<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>