2009-07-21 14 views
6

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

Odpowiedz

1

To jest bug, który został naprawiony w JAXB 2.1.13. Zaktualizuj biblioteki lub użyj JDK 1.7 lub nowszego, a problem zostanie rozwiązany.

0

Kiedy uruchomić program testowy z jdk1.6.0_20 wydaje się działać i pojawia się następujący komunikat:

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

Jaką wersję JAXB? – codefinger

+0

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 –

0

Czy próbowałeś umieszczać adnotacje w swoich akcesoriach? Miałem także ten problem z @XmlElementWrapper wcześniej, ale mam go rozwiązać poprzez umieszczenie adnotacji mojego gettera zamiast adnotacji deklaracji pola.

8

Należy używać @XmlElementRefs ({ @XmlElementRef (type = Dog.class) @XmlElementRef (type = Cat.class)}) prywatne Lista zwierząt;

lub użyj @XmlAnyElement (LAX = true) tylko i dodać Dog.class, Cat.class do JaxbContext

0

Kiedy uruchomić program testowy z jdk1.6.0_20 to nie działa, jednak kiedyś zmieniono adnotację dla listy z @XmlAnyElement(lax = true) na @XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)}), a następnie działa. Nie ma znaczenia, że ​​Dog.class i Cat.class są dodawane do JAXBContext lub nie.