2011-07-29 20 views
9

Tengo un mapa de listas que necesito ordenar. Creé XML adapater pero sigo recibiendo java.util.List is an interface, and JAXB can't handle interfaces. al crear el contexto JAXB. ¿Cómo debería alinear el Mapa de listas?referencias de JAXB Mapa de listas

Este es mi código:

@XmlRootElement(name = "myClass") 
public class MyClass { 

    @XmlJavaTypeAdapter(MapOfListsAdapter.class) 
    protected Map<Integer, List<Condition>> expectedResults; 

He escrito adaptador MapOfListsAdapater para el Mapa:

public class MapOfListsAdapter extends XmlAdapter<List<MapOfListsEntry>, Map<Integer, List<Condition>>> { 

    @Override 
    public List<MapOfListsEntry> marshal(Map<Integer, List<Condition>> v) {...} 

    @Override 
    public Map<Integer, List<Condition>> unmarshal(List<MapOfListsEntry> v) {...} 
} 

MapOfListEntry tiene estas anotaciones JAXB:

public class MapOfListsEntry { 

    @XmlAttribute 
    private Integer key; 

    @XmlElementRef 
    @XmlElementWrapper 
    private List<Condition> value; 
+1

vea el tema http://stackoverflow.com/questions/818327/jaxb-how-should-i-marshal-complex-nested -estructuras de datos. Hay la solución que quieres. – user219882

+0

Vi eso, gracias. ¿Qué sucede si quiero usar adaptadores? ¿Por qué obtengo java.util.List es una interfaz, y JAXB no puede manejar las interfaces? – padis

Respuesta

4

lo he descubierto. El problema era que ValueType en mi adaptador era Lista y esta Lista aquí era del tipo que JAXB no podía manejar. Envolver esta Lista en otra clase concreta que sea ValueType en adaptador resolvió el problema.

adaptador:

public class MapOfListsAdapter extends XmlAdapter<ListWrapper, Map<Integer, List<Condition>>> { 

    @Override 
    public ListWrapper marshal(Map<Integer, List<Condition>> v) {...} 

    @Override 
    public Map<Integer, List<Condition>> unmarshal(ListWrapper v) {...} 
} 

lista envuelta:

public class ListWrapper { 

    @XmlElementRef 
    private List<MapOfListEntry> list; 
Cuestiones relacionadas