我希望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
上。有没有办法实现我想做的事情?
答案 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>