JAXB повторно использует аннотацию из родительского класса и получает доступ к предустановленному полю - PullRequest
2 голосов
/ 26 марта 2012

Существует класс с именем 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>

1 Ответ

1 голос
/ 30 марта 2012

Посмотрите на пример Блейз Дафан . В вашем случае class A - это class MyMapEntryType, class Parent - это class MyMapType. class Child не должен расширять Parent, поскольку это промежуточный класс только для JAXB, чтобы иметь возможность отобразить список <a> элементов.

...