大約有使用JAXB的馬歇爾/解組一java.util.Map
前幾次的問題,其中許多得到指出回到這個例子,它的偉大工程:馬歇爾/解組嵌套地圖與JAXB
http://blog.bdoughan.com/2013/03/jaxb-and-javautilmap.html
然而,如果地圖不是@XmlRootElement
的成員,我無法讓JaxB能夠編組/地圖的實例。例如,這裏有一個根元素類,
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Customer {
private MyField myField
MyField getMyField() {
return myField
}
void setMyField(MyField myField) {
this.myField = myField
}
}
它的定義是外地類:
@XmlAccessorType(XmlAccessType.FIELD)
public static class MyField{
Map<String, String> getSomeMap() {
return someMap
}
void setSomeMap(Map<String, String> someMap) {
this.someMap = someMap
}
@XmlElement
private Map<String, String> someMap = new HashMap<String, String>()
}
而且一些代碼來驅動編組:
JAXBContext jc = JAXBContext.newInstance(Customer.class)
Customer customer = new Customer()
MyField myField1 = new MyField()
myField1.someMap.put("foo", "bar")
myField1.someMap.put("baz", "qux")
customer.myField = myField1
Marshaller marshaller = jc.createMarshaller()
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true)
marshaller.marshal(customer, System.out)
這個例子的結果:
java.util.Map is an interface, and JAXB can't handle interfaces.
java.util.Map does not have a no-arg default constructor.
我正在使用Groovy而不是Java編寫我的代碼,但我認爲它不會有太大區別。
你錯了。如果您按照原始問題中發佈的鏈接進行操作並關注博客,您將看到「MapAdapter」僅用於更改地圖解組爲XML的方式 - 但它本來不是*僅用於實現解組/編組。您發佈的鏈接也是如此。 此外,您可以使用'java.util.List'(也是一個接口)來嘗試上面的示例,並且使用jaxb進行編組/解組沒有問題。 – Sean
讓我問你這個。如果您將類型從Map更改爲HashMap,而無需其他修改,那麼它是否可以工作? – pczeus
在您的回覆之後,我使用SpringBoot創建了一個測試@RestController。我能夠重現你的情況 - 列表呈現,地圖不。所以,你對Map的異常行爲是正確的。我會將我的解決方案發布到這個問題上,這對您可能無效,因爲我的解決方案是將XML呈現從JAXB更改爲傑克遜,這對我來說非常合適。 – pczeus