users@jaxb.java.net

Problem mapping interfaces with XmlElementWrapper

From: Joe Kutner <jpkutner_at_gmail.com>
Date: Tue, 21 Jul 2009 13:16:57 -0500

Hello,

I am working through the example for mapping interfaces with
annotations located here:
https://jaxb.dev.java.net/guide/Mapping_interfaces.html

But I have found that it does not work. When I have a field such as:

@XmlAnyElement
private List<Animal> animals;

Every thing works correctly. But when I add a wrapper element, such as:

@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;

I find that the Java object marshals correctly, but when I unmarshal
the document created by marshaling, my list is empty. I have posted
below the code to demonstrate this problem.

Am I doing something wrong, or is this a bug? I have tried it will
version 2.1.12 and 2.2-ea with the same result.

-- Joe

@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 {}
}