2011-12-14 9 views
5

Estoy usando Spring RestTemplate para hacer llamadas en contra de un servicio web REST. Una de estas llamadas es devolver una lista de objetos de un cierto tipo. Los métodos RestTemplate requieren que se proporcione un argumento de clase para indicar el tipo de devolución esperada.¿Cómo evito las advertencias del compilador cuando la información de tipo genérico no está disponible?

// restTemplate is type org.springframework.web.client.RestTemplate 
URI restServiceURI = new URI("http://example.com/foo") 
restTemplate.getForObject(restServiceURI, List<Foo>.class); 

Obviamente, esto no se compila. No puede obtener una propiedad estática .class cuando proporciona el argumento de tipo así. El código se compila cuando elimino el argumento tipo, pero eso genera una advertencia del compilador rawtypes.

Mi pregunta es simple. ¿Estoy atascado con la supresión de la advertencia del compilador o hay una manera más limpia de codificar para esto?

Respuesta

3

Pero, ¿cómo sabría la RestTemplate convertir los elementos de la lista a instancias de la clase Foo? ¿Has intentado ejecutar el código y funciona como se esperaba?

Una forma en que puedo pensar en evitar esto sería utilizar una matriz como tipo de entrada. p.ej.

restTemplate.getForObject(restServiceURI, Foo[].class); 

Pero no sé si eso es compatible. Si realmente necesita deserializar tipos de datos más complejos, entonces debería considerar usar Jackson o Gson.

Con Jackson puede usar la clase ObjectMapper para deserializar fácilmente los datos de la mayoría de las fuentes.

String input = ...; 
ObjectMapper mapper = new ObjectMapper(); 
List<Foo> list = mapper.readValue(input, new TypeReference<List<Foo>>(){}); 

Los trabajos anteriores porque se crea intencionalmente una clase anónima que se extiende typereference, la clase recordará sus tipos genéricos en tiempo de ejecución y por lo que puede ayudar al asignador de objeto para crear listas de Foo. For a fuller explanation.

+0

Jackson está en el classpath, y Spring 3.x lo usa automáticamente para ordenar/deshacer esas transmisiones. Esperaba aprovechar eso para mi ventaja, pero parece que tengo que hacer esto en un nivel inferior. Me sorprende que Spring no haya proporcionado una manera fácil de manejar los retornos de la Colección como lo hace con otras clases de plantillas. –

+0

Este método funciona, con un refinamiento. En lugar de utilizar RestTemplate.getForObject(), estoy utilizando RestTemplate.execute() y estoy proporcionando mi propio ResponseExtractor. Esto me lleva a través de la prueba de concepto, pero me imagino que hay una manera más inteligente de determinar el tipo de respuesta del servidor. En este momento estoy asumiendo JSON, pero tendré que admitir XML en algún momento. Gracias por la dirección! –

0

Usted puede lograr usando esto:

List<Class<Foo>> classList = new ArrayList<Class<Foo>>(); 
restTemplate.getForObject(restServiceURI, classList); 

Si es sólo un objeto y no una lista de clase a continuación, puedes pasar a la siguiente:

restTemplate.getForObject(restServiceURI, Foo.class); 
+0

Su método sugerido proporciona errores de compilación. –

Cuestiones relacionadas