JAXB从父类重用注释并访问预设字段

时间:2012-03-26 12:17:59

标签: annotations jaxb hashmap jaxb2 unmarshalling

有一个名为Parent的类,它从xsd文件生成并保存一个完整的JABX注释List.此类无法更改。此外,还有一个Child extends Parent类希望使用XmlAdapterList转换为HashMapHashMap字段将具有(可能)相同的名称并映射到相同的xsd元素。

JAXB可以多次设置一个具有相同名称的字段吗? JAXB是否尝试使用父类的已填充List作为子类中XmlAdapter的输入?我认为这不会像我希望的那样有效。

如何巧妙地完成这项任务?

编辑:我真正的问题是如何使用不应编辑的JAXB自动生成的bean,并且仍然可以使用hashmap。

这是我的代码不起作用。地图保持为空。为了糟糕的代码格式而烦恼。

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 个答案:

答案 0 :(得分:1)

通过Blaise Doughan查看示例。在您的情况下,class Aclass MyMapEntryTypeclass Parentclass MyMapTypeclass Child不应扩展Parent,因为它只是JAXB能够映射<a>元素列表的中间类。