Аннотации JAXB - Отображающиеся интерфейсы и @XmlElementWrapper

Я испытываю затруднения из-за аннотаций JAXB для поля, которое является списком, тип generified которого является интерфейсом. То, когда у меня есть он, объявило, такие как:

@XmlAnyElement
private List animals;

Каждая вещь работает правильно. Но когда я добавляю элемент обертки, такой как:

@XmlElementWrapper
@XmlAnyElement
private List animals;

Я нахожу, что Java возражает маршалам правильно, но когда я неупорядочиваю документ, созданный путем маршалинга, мой список пуст. Я отправил ниже кода для демонстрации этой проблемы.

Я делаю что-то не так, или действительно ли это - ошибка? Я попробовал его версией 2.1.12 и с 2.2 EA с тем же результатом.

Я работаю через пример на отображение интерфейсов с аннотациями, расположенными здесь: https://jaxb.dev.java.net/guide/Mapping_interfaces.html

@XmlRootElement
class Zoo {

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

  public static void main(String[] args) throws Exception {
    Zoo zoo = new Zoo();
    zoo.animals = new ArrayList();
    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 {}
} 

6
задан codefinger 21 July 2009 в 13:26
поделиться