6
所以我試圖編組對象的通用列表,但我希望每個列表都有一個特定的XmlRootElement(name ..)。我這樣做的方式,我知道,如果不爲每種類型的對象編寫一個特定的包裝類並聲明XmlRootElement,就不太可能。但也許有另一種方式...?JAXB編組泛型變量根元素名稱列表
考慮下面的類:
abstract public class Entity {
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="user")
public class User extends Entity {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
@XmlRootElement
public class EntityList<T extends Entity> {
@XmlAnyElement(lax=true)
private List<T> list = new ArrayList<T>();
public void add(T entity) {
list.add(entity);
}
public List<T> getList() {
return list;
}
}
public class Test {
public static void main(String[] args) throws JAXBException {
User user1 = new User();
user1.setUsername("user1");
User user2 = new User();
user2.setUsername("user2");
EntityList<User> list = new EntityList<User>();
list.add(user1);
list.add(user2);
JAXBContext jc = JAXBContext.newInstance(EntityList.class, User.class);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(list, System.out);
}
}
正如預期的那樣,這將產生:
<entityList>
<user>
<username>user1</username>
</user>
<user>
<username>user2</username>
</user>
</entityList>
什麼,我要的是能夠修改標籤名稱,這取決於我創建實體的類型EntityList與。
我知道我們在說這裏的編譯和運行時間,但也許有某種哈克的方式來改變父子元素包裝從孩子?
感謝您指出我在這個方向...這是一個簡單的例子,因爲我使用Spring的MarshallingView爲JAXB編組。但在知道我可以在運行時使用JAXBElement作爲包裝器的情況下,我可以編寫自己的編組器,並在運行時反編譯自定義註釋。謝謝! – user1301841 2012-03-29 22:07:08