在jaxb中映射<string,myobject =“”>

时间:2015-12-22 18:50:48

标签: java xml jaxb

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

@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中不可能,因为它是强类型的。

由于

1 个答案:

答案 0 :(得分:0)

我只记得我想取消/编组Map时需要XMLAdapter。但是...似乎并非每个服务器/ JAXB实现都需要这样做,有时甚至适得其反。尽管错误消息对我没有任何帮助,但我从地图上删除@XmlJavaTypeAdapter后,它开始工作并按预期进行了编组。因此,虽然这并不是解决该消息的真正答案,但至少可以像我一样帮助其他以“我需要XMLJavaTypeAdapterMap开头的人。

如此总结:对于某些JAXB实现,您不需要@XmlJavaTypeAdapter注释,也不需要MapAdapterMapElements类。它将开箱即用。