我得到了一个简单的对象,定义如下:
@XmlRootElement(name="container")
public class Container{
@XmlJavaTypeAdapter(MapAdapter.class)
private Map<String, MyObject> myobject;
我正在尝试使用jaxb正确地反序列化/序列化。
MyObject是一个简单的bean,有两个属性“street”和“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中不可能,因为它是强类型的。
由于
答案 0 :(得分:0)
我只记得我想取消/编组Map
时需要XMLAdapter。但是...似乎并非每个服务器/ JAXB实现都需要这样做,有时甚至适得其反。尽管错误消息对我没有任何帮助,但我从地图上删除@XmlJavaTypeAdapter
后,它开始工作并按预期进行了编组。因此,虽然这并不是解决该消息的真正答案,但至少可以像我一样帮助其他以“我需要XMLJavaTypeAdapter
为Map
开头的人。
如此总结:对于某些JAXB实现,您不需要@XmlJavaTypeAdapter
注释,也不需要MapAdapter
或MapElements
类。它将开箱即用。