Mam problem z adnotacjami JAXB dla pola będącego listą, której typem generowanym jest interfejs. Kiedy mam to zadeklarowane, takie jak:Adnotacje JAXB - Interfejsy odwzorowań i @XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;
Wszystko działa poprawnie. Ale kiedy dodać element otoki, takich jak:
@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;
uważam, że Java sprzeciw marszałków poprawnie, ale kiedy unmarshal dokument stworzony przez Organizowanie, moja lista jest pusta. Zamieszczam poniżej kod, aby zademonstrować ten problem.
Czy robię coś nie tak, czy to błąd? Próbowałem go w wersji 2.1.12 i 2.2-ea z tym samym wynikiem.
pracuję poprzez przykład dla interfejsów mapowania z adnotacjami znaleźć tutaj: 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 {}
}
Jaką wersję JAXB? – codefinger
Używam wersji JAXB 2.1 dołączonej do jdk1.6.0_20. Możesz także wypróbować swój przykład za pomocą MOXy JAXB (jestem liderem technicznym). Naprawiliśmy błąd związany z Twoim pytaniem, będziesz musiał użyć codziennego (4 listopada) lub późniejszego pobrania nocnego EclipeseLink 2.2.0: http://www.eclipse.org/eclipselink/downloads/nightly.php –