我有问题通过JAXB将我的对象的映射映射到xml。为了从marshaller获取prety xml,我使用@XmlJavaTypeAdapter将Map.Entry映射到我的类,该类具有jaxb注释以创建漂亮的xml,但问题是我的包装类中的值只是对真实对象的引用,并且在及时解组时当调用adapter时,此值中为null(稍后在xml中指定该对象),当jaxb尝试解析此引用时,在解组结束时,对象将被放入我的包装器对象中,而不是放入我的地图中。
为了更好地理解,这里有一个示例xml:
<root>
<map>
<wrapper key="k1" value="n1" />
<wrapper key="k2" value="n2" />
<wrapper key="k3" value="n3" />
<wrapper key="k4" value="n4" />
</map>
<list>
<A name="n1" param="aaa" />
<A name="n2" param="bbb" />
<A name="n3" param="ccc" />
<A name="n4" param="ddd" />
</list>
</root>
和java类(它只是一个更好地理解问题的示例):
@XmlRootElement(name="root")
class Root {
@XmlElement(name = "map")
@XmlJavaTypeAdapter(MyAdapter.class)
public Map<String, A> map = new HashMap();
@XmlElementWrapper(name = "list")
@XmlElement(name = "A")
public List<A> list = new ArrayList();
}
class A {
@XmlID
@XmlAttribute
public String name;
@XmlAttribute
public String param;
}
class MyAdapter extends XmlAdapter<MapWrapper, Map<String, A>> {
@Override
public Map<String, A> unmarshal(MapWrapper v) throws Exception {
Map<String, A> map = new HashMap()
for(EntryWrapper e : v.value) {
map.put(e.key, e.value);
}
return map;
}
@Override
public MapWrapper marshal(Map<String, A> v) throws Exception {
MapWrapper mw = new MapWrapper();
for(Map.Entry<String, A> entry : v.getEntrySet()) {
mv.value.add(new EntryWrapper(entry.getKey(), entry.getValue();
}
return mw;
}
}
class MapWrapper {
@XmlElement(name = "wrapper")
public List<EntryWrapper> value = new ArrayList();
}
class EntryWrapper {
@XmlAttribute
public String key;
@XmlAttribute
@XmlIDREF
public A value;
public EntryWrapper(String key, A value) {
this.key = key;
this.value = value;
}
}
在解组之后,我在地图中有空值。