2012-03-29 15 views
6

Vì vậy, tôi đang cố gắng sắp xếp một danh sách chung của các đối tượng, nhưng tôi muốn mỗi danh sách có một XmlRootElement cụ thể (tên ..). Cách tôi đang làm nó, tôi biết nó không thực sự có thể mà không cần viết một lớp wrapper cụ thể cho từng loại đối tượng và tuyên bố XmlRootElement. Nhưng có lẽ có một cách khác ...?Danh sách chung chung của JAXB Marshalling với tên phần tử gốc biến

Hãy xem xét các loại sau đây:

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

} 

Đúng như dự đoán, điều này tạo ra:

<entityList> 
    <user> 
     <username>user1</username> 
    </user> 
    <user> 
     <username>user2</username> 
    </user> 
</entityList> 

gì tôi muốn là để có thể thay đổi mà tên thẻ, tùy thuộc vào loại Entity i tạo EntityList với.

Tôi biết chúng ta đang nói về biên dịch so với thời gian chạy ở đây, nhưng có thể có một số cách hacky để thay đổi trình bao bọc phần tử gốc từ con?

Trả lời

3

Bạn có thể bọc thể hiện của EntityList trong JAXBElement để cung cấp tên phần tử gốc khi chạy.

Ví dụ

+0

Cảm ơn đã chỉ cho tôi theo hướng đó ... Đây là một ví dụ đơn giản, như tôi đang sử dụng MarshallingView Spring cho JAXB Marshalling. Nhưng với việc biết rằng tôi có thể sử dụng JAXBElement như một trình bao bọc trong thời gian chạy, tôi có thể viết thực thi marshaller của riêng mình cho mùa xuân và nhìn vào một số chú thích tùy chỉnh trong thời gian chạy. Cảm ơn! – user1301841

Các vấn đề liên quan