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 {}
}
¿Qué versión de JAXB? – codefinger
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 –