unmarshall使用泛型参数进行分类

时间:2014-04-29 12:08:06

标签: java xml jaxb unmarshalling

我试图将带有库JAXB的xml字符串反序列化为特定的类。

public class Sandbox {
    public static void main(String[] args) throws JAXBException {
        String xml = "<root><child><base-value>val1</base-value><baseimpl-value>val2</baseimpl-value></child></root>";
        Sandbox.Do(xml, BaseImpl.class);
    }

    public static void Do(String xml, Class c) throws JAXBException{
        JAXBContext jc = JAXBContext.newInstance(Parent.class, c);
        Unmarshaller um = jc.createUnmarshaller();

        Parent<BaseImpl> p = (Parent<BaseImpl>) um.unmarshal(new StringReader(xml));
        System.out.println(p.child);
    }
}

@XmlRootElement(name = "root")
class Parent<T extends Base> {
    @XmlElement
    T child;
}

abstract class Base {
    @XmlElement(name = "base-value")
    String BaseValue;
}

@XmlRootElement
class BaseImpl extends Base {
    @XmlElement(name = "baseimpl-value")
    String BaseImplValue;

    @Override
    public String toString(){
        return super.BaseValue + ", " + this.BaseImplValue;
    }
}

JAXB正在尝试初始化Base接口,虽然类名传递给Unable to create an instance of sandbox.Base...函数,但异常JAXBContext.newInstance事件失败了。

1 个答案:

答案 0 :(得分:0)

我又花了几个小时诅咒Jaxb,最后找到解决问题的方法。缺少的是name注释中的参数@XmlRootElement(name = "child")。这就是我所需要的一切,一切正常。

希望有人会发现这有用并节省他的时间。