2012-03-29 7 views
6

Also ich versuche, eine generische Liste von Objekten zu marshallen, aber ich möchte, dass jede Liste ein bestimmtes XmlRootElement (Name ..) hat. So wie ich es mache, weiß ich, dass es nicht wirklich möglich ist, ohne eine spezielle Wrapper-Klasse für jeden Objekttyp zu schreiben und das XmlRootElement zu deklarieren. Aber vielleicht gibt es einen anderen Weg ...?JAXB Generische Liste mit variablem Stammelement mit Namen versehen

Betrachten Sie die folgenden Klassen:

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

} 

Wie erwartet, dies erzeugt:

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

Was ich will, ist in der Lage sein, diese Tag-Namen zu ändern, von der Art der Entity je i erstellen die EntityList mit.

Ich weiß, wir reden Kompilieren vs Laufzeit hier, aber vielleicht gibt es eine Art Hacky Weg, um die Elternelement Wrapper von dem Kind zu ändern?

Antwort

3

Sie können die Instanz von EntityList in ein JAXBElement umbrechen, um zur Laufzeit einen Stammelementnamen anzugeben.

Beispiel

+0

Danke für mich in dieser Richtung zeigen ... Dies ist ein vereinfachtes Beispiel, wie ich Spring MarshallingView für JAXB Rangierung bin mit. Aber mit dem Wissen, dass ich JAXBElement zur Laufzeit als Wrapper verwenden kann, kann ich meine eigene Marshaller-Implementierung für den Frühling schreiben und zur Laufzeit eine Art benutzerdefinierte Annotation inspizieren. Vielen Dank! – user1301841

Verwandte Themen