2011-07-14 181 views
2

我正在使用J2SE附帶的JAXB實現序列化一個包含HashMap屬性的bean。我會認爲這應該工作的開箱,因爲 this狀態JAXB忽略HashMap屬性?

當它作爲一個bean的歡迎使用屬性JAXB規範定義了一個特殊處理的地圖。例如,下面的豆會產生個XML像下面這樣: ...

這或多或少的作品,除非該結構具有一個以上的水平,即HashMap的是Bean的屬性是一個屬性一個bean的 - 這樣的:

import java.util.HashMap; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.JAXB; 

class bean { 
    @XmlElement public HashMap<String,String> map; 
} 

@XmlRootElement class b2 { 
    @XmlElement public bean b; 
} 


class foo { 
    public static void main(String args[]) { 
     try { 
      bean b = new bean(); 
      b.map = new HashMap<String,String>(); 
      b.map.put("a","b"); 
      b2 two = new b2(); 
      two.b=b; 
      JAXB.marshal(two, System.out); 

     } catch (Exception e) { 
      System.out.println("Exception: " + e.toString()); 
     } 
    } 
} 

此輸出 <?xml version="1.0" encoding="UTF-8" standalone="yes"?><b2><b><map/></b></b2>,而不是一個格式正確的HashMap中。它工作,如果我註釋bean@XmlRootElement並從map刪除@XmlElement,但我不明白爲什麼這是必要的。它應該是這樣嗎?

回答

1

的解釋是你鏈接的網站上給出:

不幸的是,由於2.1,此處理只對豆 屬性定義,而不是當你元帥的HashMap作爲頂級對象 (如作爲JAXBElement中的一個值)。在這種情況下,HashMap將被作爲一個Java bean處理爲 ,並且當您將HashMap看作一個bean時,它將不會定義任何getter/setter屬性對,因此以下代碼將生成以下XML :

豆與地圖:

m = new HashMap(); 
m.put("abc",1); 
marshaller.marshal(new JAXBElement(new QName("root"),HashMap.class,m),System.out); 

XML表示:

<root /> 

這個問題已經被記錄爲#223和修復需要 後來JAXB規範的版本發生。

+0

'map' **被**定義爲屬性並且仍然不起作用 –

+0

這裏的情況是,將Map作爲一個bean屬性的特殊處理只會在'@ XmlElement'註釋不存在。通過這個註解,Map被視爲一個bean。由於沒有JavaBean獲取器和設置器,因此生成的XML元素爲空。 – vanje

+0

@vanje,感謝您的評論 - so ... – themel