Аннотации JAXB-интерфейсы отображения и @XmlElementWrapper
у меня проблемы с аннотации JAXB на поле, список которых обобщены тип интерфейса. Когда у меня это объявлено, например:
@XmlAnyElement
private List<Animal> animals;
все работает правильно. Но когда я добавляю элемент оболочки, например:
@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;
Я считаю, что маршалы объектов Java правильно, но когда я unmarshal документ, созданный маршалингом, мой список пуст. Я написал ниже код, чтобы продемонстрировать эту проблему.
Я что-то делаю неправильно, или это баг? Я пробовал это с версиями 2.1.12 и 2.2-ea с тем же результатом.
Я работаю над примером для отображения интерфейсов с аннотациями, расположенными здесь: 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 ответов
Это ошибка это было исправлено в JAXB 2.1.13. Обновите свои библиотеки или используйте JDK 1.7 или более позднюю версию, и проблема будет решена.
должны использовать @XmlElementRefs({ @XmlElementRef(тип=собака.класс), @XmlElementRef (type=Cat.класс)}) частный список животных;
или использовать @XmlAnyElement (lax = true) только и добавьте Dog.класс, Кэт.класс в JaxbContext
когда я запускаю вашу тестовую программу с jdk1.6.0_20 он работает, и я получаю следующий вывод:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo><animals><dog/><cat/></animals></zoo>
it worked
вы пробовали поместить свои аннотации в свои аксессуары? У меня также была эта проблема с @XmlElementWrapper раньше, но я решил ее, поместив аннотацию моего геттера вместо аннотации объявления поля.
когда я запускаю вашу тестовую программу с jdk1.6.0_20 это не работает, однако, как только я изменил аннотацию для списка из @XmlAnyElement(lax = true)
до @XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)})
затем он работает. Не имеет значения, что Dog.class
и Cat.class
добавляются в JAXBContext или нет.