通过适配器映射的包装类中的JAXB转发引用

时间:2013-08-05 11:03:34

标签: java jaxb jersey unmarshalling xmladapter

我有问题通过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;
    }
}

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

0 个答案:

没有答案