Следуя этому примеру (http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html) Блейза Дафана, который работает, я пытаюсь обобщить его для любого типа с использованием обобщений.
Я получил:
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyMapType<K, V> {
public List<MyMapEntryType<K, V>> entry;
public MyMapType() {
entry = new ArrayList<MyMapEntryType<K, V>>();
}
}
а,
import javax.xml.bind.annotation.*;
public class MyMapEntryType<K, V> {
@XmlAttribute
public K key;
@XmlValue
public V value;
}
тогда
import java.util.*;
import java.util.Map.Entry;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public final class MyMapAdapter<K, V> extends
XmlAdapter<MyMapType<K, V>, Map<K, V>> {
@Override
public MyMapType<K, V> marshal(Map<K, V> arg0) throws Exception {
MyMapType<K, V> myMapType = new MyMapType<K, V>();
for (Entry<K, V> entry : arg0.entrySet()) {
MyMapEntryType<K, V> myMapEntryType = new MyMapEntryType<K, V>();
myMapEntryType.key = entry.getKey();
myMapEntryType.value = entry.getValue();
myMapType.entry.add(myMapEntryType);
}
return myMapType;
}
@Override
public Map<K, V> unmarshal(MyMapType<K, V> arg0) throws Exception {
HashMap<K, V> hashMap = new HashMap<K, V>();
for (MyMapEntryType<K, V> myEntryType : arg0.entry) {
hashMap.put(myEntryType.key, myEntryType.value);
}
return hashMap;
}
}
наконец,
package forum832656;
import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo<K, V> {
@XmlJavaTypeAdapter(MyMapAdapter.class)
Map<K, V> map = new HashMap<K, V>();
public Foo() {
}
public Map<K, V> getMap() {
return map;
}
public void setMap(Map<K, V> map) {
this.map = map;
}
}
Тогда я попробовал это,
Foo<Integer,String> f = new Foo<Integer,String>();
f.getMap().put(1, "HELLO");
f.getMap().put(2, "WORLD");
JAXBContext context = JAXBContext.newInstance(Foo.class,MyMapType.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(f, System.out);
Но я получил исключение NullPointerException в строке создания JAXBContext ....
Есть идеи?