2009-07-21 19 views
6

Tengo problemas con las anotaciones JAXB para un campo que es una lista cuyo tipo generizado es una interfaz. Cuando lo tengo declarado como:Anotaciones JAXB - Interfaces de mapeo y @XmlElementWrapper

@XmlAnyElement 
private List<Animal> animals; 

Todo funciona correctamente. Pero cuando agrego un elemento de envoltura, tales como:

@XmlElementWrapper 
@XmlAnyElement 
private List<Animal> animals; 

Me parece que el objeto Java mariscales correctamente, pero cuando unmarshal el documento creado por el cálculo de referencias, mi lista está vacía. He publicado debajo el código para demostrar este problema.

¿Estoy haciendo algo mal, o es esto un error? Lo he intentado con la versión 2.1.12 y 2.2-ea con el mismo resultado.

estoy trabajando a través del ejemplo de mapeo para las interfaces con las anotaciones que se encuentran aquí: https://jaxb.dev.java.net/guide/Mapping_interfaces.html

@XmlRootElement 
class Zoo { 

    @XmlElementWrapper 
    @XmlAnyElement(lax = true) 
    private List<Animal> animals; 

    public static void main(String[] args) throws Exception { 
    Zoo zoo = new Zoo(); 
    zoo.animals = new ArrayList<Animal>(); 
    zoo.animals.add(new Dog()); 
    zoo.animals.add(new Cat()); 

    JAXBContext jc = JAXBContext.newInstance(Zoo.class, Dog.class, Cat.class); 
    Marshaller marshaller = jc.createMarshaller(); 

    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    marshaller.marshal(zoo, os); 

    System.out.println(os.toString()); 

    Unmarshaller unmarshaller = jc.createUnmarshaller(); 
    Zoo unmarshalledZoo = (Zoo) unmarshaller.unmarshal(new ByteArrayInputStream(os.toByteArray())); 

    if (unmarshalledZoo.animals == null) { 
     System.out.println("animals was null"); 
    } else if (unmarshalledZoo.animals.size() == 2) { 
     System.out.println("it worked"); 
    } else { 
     System.out.println("failed!"); 
    } 
    } 

    public interface Animal {} 

    @XmlRootElement 
    public static class Dog implements Animal {} 

    @XmlRootElement 
    public static class Cat implements Animal {} 
} 

Respuesta

1

Este es un bug que se ha corregido en JAXB 2.1.13. Actualice sus bibliotecas o use JDK 1.7 o posterior y el problema será resuelto.

0

Cuando ejecuto el programa de prueba con jdk1.6.0_20 parece funcionar y me da el siguiente resultado:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<zoo><animals><dog/><cat/></animals></zoo> 
it worked 
+0

¿Qué versión de JAXB? – codefinger

+0

Me utilizan la versión de JAXB 2.1 incluida con jdk1.6.0_20. También puedes probar tu ejemplo con MOXy JAXB (soy el líder tecnológico). Solucionamos un error relacionado con su pregunta, deberá usar la descarga nocturna de hoy (4 de noviembre) o posterior de EclipeseLink 2.2.0: http://www.eclipse.org/eclipselink/downloads/nightly.php –

0

¿Ha intentado poner sus anotaciones en sus accesorios? También tuve este problema con @XmlElementWrapper antes, pero lo resolví poniendo la anotación de mi getter en lugar de anotar la declaración de campo.

8

Deben usar @XmlElementRefs ({ @XmlElementRef (type = Dog.class), @XmlElementRef (type = Cat.class)}) Lista animales privados;

o utilizar @XmlAnyElement (LAX = true) solamente, y añadir Dog.class, Cat.class a JAXBContext

0

Cuando ejecuto el programa de prueba con jdk1.6.0_20 no funciona, sin embargo una vez que cambió la anotación para la lista de @XmlAnyElement(lax = true) a @XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)}) y luego funciona. No importa que Dog.class y Cat.class se hayan agregado a JAXBContext o no.

Cuestiones relacionadas