2012-03-29 34 views
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與。

我知道我們在說這裏的編譯和運行時間,但也許有某種哈克的方式來改變父子元素包裝從孩子?

回答

3

您可以將EntityList的實例包裝到JAXBElement中以在運行時提供根元素名稱。

+0

感謝您指出我在這個方向...這是一個簡單的例子,因爲我使用Spring的MarshallingView爲JAXB編組。但在知道我可以在運行時使用JAXBElement作爲包裝器的情況下,我可以編寫自己的編組器,並在運行時反編譯自定義註釋。謝謝! – user1301841 2012-03-29 22:07:08