我得到了一个定义如下的简单对象:
@XmlRootElement(name="container")
public class Container{
@XmlJavaTypeAdapter(MapAdapter.class)
private Map<String, MyObject> myobject;
我正在尝试使用jaxb正确地反序列化/序列化它。
MyObject是一个简单的bean,有两个属性"street"one_answers"address"作为String。
在stackoverflow中,我找到了关于如何将jaxb与Map一起使用的示例,但在本例中,我希望使用对象MyObject。
MapAdapter被定义为
class MapElements {
@XmlAttribute
public String key;
@XmlElement
public MyObject value;
private MapElements() {
} //Required by JAXB
public MapElements(String key, MyObject value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public MyObject getValue() {
return value;
}
public void setValue(MyObject value) {
this.value = value;
}
}
public class MapAdapter extends XmlAdapter<MapElements[], Map<String, MyObject>> {
public MapAdapter() {
}
public MapElements[] marshal(Map<String, MyObject> arg0) throws Exception {
MapElements[] mapElements = new MapElements[arg0.size()];
int i = 0;
for (Map.Entry<String, MyObject> entry : arg0.entrySet()){
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
}
return mapElements;
}
public Map<String, MyObject> unmarshal(MapElements[] arg0) throws Exception {
Map<String, MyObject> r = new TreeMap<String, MyObject>();
for (MapElements mapelement : arg0)
r.put(mapelement.key, mapelement.value);
return r;
}
}
但一旦我试图反序列化对象,我就得到了错误
487:Can not set java.lang.String field com.company.mypackage.myservice.MapElements.key to [Lcom.company.mypackage.myservice.MapElements;
在jaxb中可能无法做到这一点,因为它是强类型的。
感谢
我只记得当我想取消/整理Map
时,我需要一个XMLAdapter。但是似乎并不是每个服务器/JJAXB实现都需要这样做,有时甚至会适得其反。虽然错误消息对我没有任何帮助,但当我从映射中删除@XmlJavaTypeAdapter
时,它就开始工作,并按预期进行了整理。因此,虽然这并不是解决这个问题的真正答案,但它至少可以帮助其他人,就像我一样,从"我需要一个XMLJavaTypeAdapter
来代替Map
"开始。
综上所述:对于某些JAXB实现,您不需要@XmlJavaTypeAdapter
-注释,也不需要MapAdapter
或MapElements
-类。开箱即用。