无论如何使用JAXBIntrospector而没有用于Jaxb unmarshall的类转换转换

时间:2018-03-17 18:47:28

标签: java jaxb

我喜欢在我的代码中没有警告,但是这个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;                                                                           
}   

2 个答案:

答案 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 )));

并摆脱关于未经检查的演员的警告。