JAXB Annotations - Сопоставление интерфейсов и @XmlElementWrapper - PullRequest
6 голосов
/ 21 июля 2009

У меня проблемы с аннотациями JAXB для поля, представляющего собой список, обобщенный тип которого является интерфейсом. Когда я это объявил, например:

@XmlAnyElement
private List<Animal> animals;

Все работает правильно. Но когда я добавляю элемент-обертку, например:

@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;

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

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

Я работаю над примером отображения интерфейсов с аннотациями, расположенными здесь: 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 {}
} 

Ответы [ 5 ]

8 голосов
/ 28 февраля 2011

следует использовать @XmlElementRefs ({ @XmlElementRef (тип = Dog.class), @XmlElementRef (тип = Cat.class)}) личный список животных;

или используйте Только @XmlAnyElement (lax = true) и добавьте Dog.class, Cat.class в JaxbContext

1 голос
/ 19 марта 2015

Это ошибка , которая была исправлена ​​в JAXB 2.1.13. Обновите свои библиотеки или используйте JDK 1.7 или более позднюю версию, и проблема будет решена.

0 голосов
/ 12 сентября 2011

Когда я запускаю вашу тестовую программу с jdk1.6.0_20, она не работает, однако, как только я изменил аннотацию для списка с @XmlAnyElement(lax = true) на @XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)}), она работает. Неважно, что Dog.class и Cat.class добавлены в JAXBContext или нет.

0 голосов
/ 20 декабря 2010

Вы пытались поместить свои аннотации в свои аксессуары? У меня также была эта проблема с @XmlElementWrapper и раньше, но я решил ее, поставив аннотирование моего геттера вместо аннотирования объявления поля.

0 голосов
/ 29 июля 2010

Когда я запускаю вашу тестовую программу с jdk1.6.0_20, она работает, и я получаю следующий вывод:

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