JAXB继承+ XMLAdapter(HasMap)

时间:2015-12-19 14:22:02

标签: java xml inheritance jaxb hashmap

我正在制作一个应用程序,它将包含XML文件中的数据。

我现在遇到一个问题:JAXB没有编组我的子类,因此当我使用XML文件时,所有对象都是Parent类的对象。 我尝试了@XMLSeeAlsoAccessType.FIELDJAXBContext jaxbContext = JAXBContext.newInstance(Important.class, Parent.class, Child.class);的一些变体     public class Main { public static void main(String args[]){ JAXB jaxb = new JAXB(); Parent parent = new Parent(1); Child child = new Child(2,3) Important important = new Important(); jaxb.write(important); } } ,但似乎我错过了解某些东西,而且它没有用。

你可以给我一些建议吗?我应该使用什么注释?还是mb XMLAdapter? 我项目的当前结构是(我试图简化它):

Main.java

@XmlRootElement(name="important")
public class Important {
public Map<Integer, Parent> hashMap;
    //some code here
}

Important.java

public class Parent{
    public int parentField;
    //constructor
}

Parent.java

public class Child extends Parent {
    public int childField;
    //constructors
}

Child.java

public class JAXB {
    public void write(Important important) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Important.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(important, System.out);

        } catch (JAXBException e) {
            System.err.println(e + "Error.");
        }
    }
}

简单的JAXB类。 JAXB.java

<important>
   <hashMap>
       <entry>
           <key>0</key>
           <value>
               <parentField>1</parentField>
           </value>
       </entry>
       <entry>
           <key>0</key>
           <value>
               <parentField>2</parentField>
           </value>
       </entry>
   </hashMap>

但是在编组后它返回XML,它不包含任何关于孩子的信息。

#reportPage

然后关闭标记。

我的地图100%包含不同类型的类:父级和子级

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

@XmlSeeAlso注释让JAXBContext了解您的子类。

@XmlSeeAlso(Child.class)添加到Parent类应该可以解决问题。

供参考,另请参阅Using JAXB to pass subclass instances as superclass的接受答案。

提议的解决方案

@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso(Child.class)
public class Parent {

    public int parentField;

    public Parent(Integer parentField) {
        this.parentField = parentField;
    }
}

我的结果

<important>
    <map>
        <entry>
            <key>0</key>
            <value>
                <parentField>1</parentField>
            </value>
        </entry>
        <entry>
            <key>1</key>
            <value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="child">
                <parentField>2</parentField>
                <childField>3</childField>
            </value>
        </entry>
    </map>
</important>