2012-03-29 10 views
6

Por lo tanto, intento ordenar una lista genérica de objetos, pero quiero que cada lista tenga un XmlRootElement específico (nombre ...). La forma en que lo hago, sé que no es posible sin escribir una clase contenedora específica para cada tipo de objeto y declarar el XmlRootElement. Pero tal vez hay otra manera ...?JAXB Lista genérica de Marshalling con nombre de elemento de raíz variable

considerar las siguientes clases:

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

} 

Como era de esperar, esto produce:

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

Lo que quiero es ser capaz de modificar ese nombre de la etiqueta, dependiendo del tipo de Entidad i crear EntityList con.

Sé que estamos hablando de compilación vs tiempo de ejecución aquí, pero tal vez hay algún tipo de forma hacky para cambiar el contenedor de elemento principal del niño?

Respuesta

3

Puede envolver la instancia de EntityList en un JAXBElement para proporcionar un nombre de elemento raíz en tiempo de ejecución.

Ejemplo

+0

Gracias por señalarme en esa dirección ... Este es un ejemplo simplificado, ya que estoy usando MarshallingView de primavera para JAXB Marshalling. Pero sabiendo que puedo usar JAXBElement como envoltorio en tiempo de ejecución, puedo escribir mi propia implementación de Marshallis para la primavera e introspectar algún tipo de anotación personalizada en tiempo de ejecución. ¡Gracias! – user1301841

Cuestiones relacionadas