我知道,我可以使用Raw类型来编写
XMLAdapter,但我可以使用泛型类型.我尝试阅读API(
link),但甚至没有注意到这一点的线索.
例如地图:
我想用,比如:
@XmlJavaTypeAdapter(GenericMapAdapter<String,Double>.class)// private final HashMap<String,Double> depWageSum = // new HashMap<String,Double>();
要得到
<depWageSum> <entry key="RI">289.001</entry> <entry key="VT">499.817</entry> <entry key="HI">41.824</entry> ... <depWageSum>
类本身可能看起来像以下几行:
@SuppressWarnings("serial") public class GenericMapAdapter<K,V> extends XmlAdapter<GenericMapAdapter.MapType<K,V>,Map<K,V>> { public static class MapType<K,V> { @XmlValue protected final List<MapTypeEntry<K,V>> entry = new ArrayList<MapTypeEntry<K,V>>(); public static class MapTypeEntry<K,V> { @XmlAttribute protected K key; @XmlValue protected V value; private MapTypeEntry() {}; public static <K,V> MapTypeEntry<K,V> of(final K k,final V v) { return new MapTypeEntry<K,V>() {{this.key = k; this.value = v;}}; } } } @Override public Map<K,V> unmarshal(final GenericMapAdapter.MapType<K,V> v) throws Exception { return new HashMap<K,V>() {{ for (GenericMapAdapter.MapType.MapTypeEntry<K,V> myEntryType : v.entry) this.put(myEntryType.key,myEntryType.value);}}; } @Override public MapType<K,V> marshal(final Map<K,V> v) throws Exception { return new GenericMapAdapter.MapType<K,V>() {{for (K key : v.keySet()) this.entry.add(MapTypeEntry.of(key,v.get(key)));}}; } }
解决方法
您将无法按照描述执行此操作.类不会保留类型参数.但是,您可以引入一些可以利用GenericMapAdapter中的逻辑的简单子类:
public class StringDoubleMapAdapter extends GenericMapAdapter<String,Double> { }
然后在属性上使用适配器子类:
@XmlJavaTypeAdapter(StringDoubleMapAdapter.class)// private final HashMap<String,Double>();
有关XmlAdapter的更多信息,请参阅:
> http://bdoughan.blogspot.com/2010/07/xmladapter-jaxbs-secret-weapon.html