Существует класс с именем Parent
, сгенерированный из файла xsd и содержащий полностью аннотированный JABX List.
Этот класс нельзя изменить.Кроме того, есть класс Child extends Parent
, который хотел бы использовать XmlAdapter
для преобразования List
в HashMap
.Поле HashMap
будет иметь (может иметь) одно и то же имя и соответствовать одному и тому же элементу xsd.
Может ли JAXB устанавливать поле с одним и тем же именем несколько раз?Пытается ли JAXB использовать уже заполненный List
родительского класса в качестве входных данных для XmlAdapter
в дочернем классе?Я полагаю, что это не сработает так, как я надеюсь.
Как эту задачу можно выполнить аккуратно?
РЕДАКТИРОВАТЬ: Мой реальный вопрос на самом деле, как использовать автоматически сгенерированные bean-компоненты JAXBэто не должно быть отредактировано и все еще иметь возможность использовать хэш-карту.
Вот мой код, который не работает.Карта остается нулевой.Прошу прощения за плохое форматирование кода.
public class Adapter extends XmlAdapter<LinkedList<A>,HashMap<String,A>> {
@Override
public LinkedList<A> marshal(HashMap<String, A> v) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public HashMap<String, A> unmarshal(LinkedList<A> v) throws Exception {
HashMap<String, A> map = new HashMap<String, A>();
for(A a:v) {
map.put(a.k, a);
}
return map;
}
}
@XmlRootElement
public class Child extends Parent {
@XmlElement(name="a")
@XmlJavaTypeAdapter(Adapter.class)
HashMap<String,A> map;
}
@XmlRootElement
public class Parent {
@XmlElement(name="a")
LinkedList<A> values = new LinkedList<A>();
}
public class XmlTest {
public static void main(String[] args) throws ParserConfigurationException, JAXBException, SAXException, IOException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(new File("test.xml"));
JAXBContext jc = JAXBContext.newInstance(Child.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Child instance = unmarshaller.unmarshal(doc,Child.class).getValue();
}
}
Вот класс A:
public class A {
@XmlAttribute
String v;
@XmlAttribute
String k;
}
Здесь test.xml
:
<root>
<a v="1" k="a"/>
<a v="2" k="b"/>
</root>