我喜欢在我的代码中没有警告,但是这个jaxb类运行良好,由于缺少jdk方法变体,确实会产生类别转换警告。有没有办法支持所有jaxb转换而不会收到此警告。我使用JAXBIntrospector而不仅仅是Unmarshaller,因为一些仅使用unmarshaller的jaxb类会引发错误。
这是示例代码:
public static <T> T unmarshall( final String xml , final Class<T> clazz ) throws Exception
{
T rtn = null;
JAXBContext jaxbContext;
jaxbContext = jaxbContextCache.get( clazz );
if ( jaxbContext == null )
{
jaxbContext = JAXBContext.newInstance( Class.forName( clazz.getName() ) );
jaxbContextCache.put( clazz , jaxbContext );
}
final Reader reader = new StringReader(xml);
final XMLInputFactory xif = XMLInputFactory.newInstance();
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
xif.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);
final XMLStreamReader xmlReader = xif.createXMLStreamReader(reader);
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
rtn = (T) JAXBIntrospector.getValue( unmarshaller.unmarshal( xmlReader ) ); // warning cast conversion
return rtn;
}
答案 0 :(得分:0)
如果你知道T
的类,你可以解组JAXBElement<T>
并返回值。一些事情:
JAXBElement<T> element = unmarshaller.unmarshal(xmlReader, clazz);
return element.getValue();
您不需要JAXBIntrospector
。
答案 1 :(得分:0)
由于clazz
类型为Class<T>
,您可以使用其cast(Object)
方法而不是使用强制转换运算符(T)
。
替换
行rtn = (T) JAXBIntrospector.getValue( unmarshaller.unmarshal( xmlReader ) ); // warning cast conversion
通过
rtn = clazz.cast(JAXBIntrospector.getValue( unmarshaller.unmarshal( xmlReader )));
并摆脱关于未经检查的演员的警告。