Java Generics for unmarshall JAXB Object

时间:2016-12-20 17:45:06

标签: java xml generics jaxb

我有以下代码将xml解组为Java对象。我想看看是否可以通过使用Java Generics而不是使用Object类型作为返回值来增强此代码。

protected static <T> Object unmarshall(String xml, Class<T> clazz)
        throws JAXBException {
    JAXBContext jc = JAXBContext.newInstance(clazz);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    Object obj = unmarshaller.unmarshal(new StringReader(xml));
    return obj;
}

任何建议。

2 个答案:

答案 0 :(得分:7)

是的,您可以稍微增强您的代码:

protected static <T> T unmarshall(String xml, Class<T> clazz)
        throws JAXBException {
    JAXBContext jc = JAXBContext.newInstance(clazz);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    T obj = clazz.cast(unmarshaller.unmarshal(new StringReader(xml)));
    return obj;
}

答案 1 :(得分:3)

如果您不需要重用JAXBContext,则无需创建它。有一种方便的方法(几乎)有你想要的方法签名。它抛出一个declare @Bin varbinary(max) = convert(varbinary(max), 'My binary value') select concat('varbinary value is: ', cast(@Bin as varchar(max))) (很多人更喜欢)。

RuntimeException

但是imo,只需在没有包装器的情况下直接使用该方法。

从长远来看,重用JAXBContext会使(联合国)编组更快。另一个改进是clazz.cast(),以避免令人讨厌的未经检查的演员

protected static <T> T unmarshall(String xml, Class<T> clazz) {
    return JAXB.unmarshal(new StringReader(xml), clazz);
}