JAXB игнорирует свойства HashMap?
Я использую реализацию JAXB, которая поставляется с J2SE, для сериализации bean-компонента, содержащего свойство HashMap. Я предположил бы, что это должно работать из коробки, так как это заявляет
Спецификация JAXB определяет специальную обработку для Map, когда она используется в качестве объекта bean. Например, следующий bean-компонент будет производить XML-файлы, подобные следующим:...
Это более или менее работает, если структура не имеет более одного уровня, то есть HashMap - это свойство компонента, которое является свойством компонента, например:
import java.util.HashMap;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.JAXB;
class bean {
@XmlElement public HashMap<String,String> map;
}
@XmlRootElement class b2 {
@XmlElement public bean b;
}
class foo {
public static void main(String args[]) {
try {
bean b = new bean();
b.map = new HashMap<String,String>();
b.map.put("a","b");
b2 two = new b2();
two.b=b;
JAXB.marshal(two, System.out);
} catch (Exception e) {
System.out.println("Exception: " + e.toString());
}
}
}
Это выводы<?xml version="1.0" encoding="UTF-8" standalone="yes"?><b2><b><map/></b></b2>
вместо правильно отформатированного HashMap. Это работает, если я аннотирую bean
с @XmlRootElement
и удалите @XmlElement
от map
Но я не понимаю, почему это необходимо. Это должно быть так?
1 ответ
Объяснение дано на сайте, на который вы ссылаетесь:
К сожалению, начиная с версии 2.1, эта обработка определяется только для свойств bean-компонента, а не когда маршал HashMap является объектом верхнего уровня (например, значением в JAXBElement.) В таком случае HashMap будет обрабатываться как Java-бин, а когда вы смотрите на HashMap как на bean-компонент, он не определяет пару свойств getter / setter, поэтому следующий код выдаст следующий XML:
Бин с картой:
m = new HashMap();
m.put("abc",1);
marshaller.marshal(new JAXBElement(new QName("root"),HashMap.class,m),System.out);
XML представление:
<root />
Эта проблема была зарегистрирована как #223, и исправление должно произойти в более поздних версиях спецификации JAXB.