Map<String, MyObject> in jaxb



我得到了一个定义如下的简单对象:

@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-注释,也不需要MapAdapterMapElements-类。开箱即用。

最新更新