2009-07-21 88 views
6

我遇到JAXB批註的字段是一個列表,它的generified類型是一個接口。當我宣佈如:JAXB註釋 - 映射接口和@XmlElementWrapper

@XmlAnyElement 
private List<Animal> animals; 

每件事情都正常工作。但是,當我添加一個包裝元素,如:

@XmlElementWrapper 
@XmlAnyElement 
private List<Animal> 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<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 {} 
} 

回答

1

這是在JAXB 2.1.13中修復的bug。更新您的庫或使用JDK 1.7或更高版本,問題將得到解決。

0

當我運行jdk1.6.0_20它似乎工作,你的測試程序,我得到下面的輸出:

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

什麼版本的JAXB? – codefinger 2010-11-04 19:41:25

0

您是否嘗試將您的註釋放入配件中?我之前也有@XmlElementWrapper這個問題,但是我通過註釋我的getter而不是註釋字段聲明來解決它。

8

應該使用 @XmlElementRefs({ @XmlElementRef(類型= Dog.class) @XmlElementRef(類型= Cat.class)}) 私人列表動物;

或使用 @XmlAnyElement(LAX =真)只,並添加Dog.class,Cat.class到的JAXBContext

0

當我運行jdk1.6.0_20它不工作,你的測試程序,但是一旦我將列表中的註釋從@XmlAnyElement(lax = true)更改爲@XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)}),然後運行。無論是否將Dog.classCat.class添加到JAXBContext中都沒有關係。