1

我在通过 JAXB 将我的对象映射到 xml 时遇到问题。为了从编组器获取漂亮的 xml,我使用 @XmlJavaTypeAdapter 将 Map.Entry 映射到我的类,该类具有 jaxb 注释以创建漂亮的 xml,但问题是我的包装类中的值只是对真实对象的引用,并且及时解组当调用适配器时,此值中存在空值(该对象稍后在 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;
    }
}

解组后我在地图中有空值。

4

0 回答 0