with the generic example and java spring rest generics spring-mvc

java - the - spring dao



No se puede obtener una ResponseEntity<T> genérica donde T es una clase genérica "SomeClass<SomeGenericType>" (1)

Este era un problema conocido . Ahora se soluciona con la introducción de ParameterizedTypeReference , que es un tipo parametrizado que hereda explícitamente para proporcionar información de tipo en tiempo de ejecución. Esto se conoce como un token de supertipo, y funciona alrededor del borrado de tipo porque las subclases (anónimo en este caso) mantienen los argumentos de tipo del supertipo genérico en tiempo de ejecución.

Sin embargo, no puede usar postForObject porque la API solo admite exchange() :

ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange( rootUrl, HttpMethod.POST, null, new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});

Tenga en cuenta que la última línea demuestra la idea de tokens de tipo súper : no se proporciona el literal CisResponse.class , sino una instanciación anónima del tipo ParameterizedTypeReference<T> , que en tiempo de ejecución se puede esperar que extraiga información de subtipo. Puedes pensar en tokens tipo super como hacks para lograr Foo<Bar<Baz>>.class

Por cierto, en Java no es necesario prefijar el acceso a la variable de instancia con this : si su objeto define una url y miembros de template , solo acceda a ellos con su nombre simple, y no añadiendo el prefijo como lo hace con this.url y this.template

Ayúdenme a obtener ResponseEntity<T> donde T es en sí mismo un tipo genérico. Como lo veo ahora, esto no está soportado hoy por la primavera RestTemplate. Estoy usando Spring MVC versión 3.1.2

Aquí está mi código, que quiero usar: Código:

ResponseEntity<CisResponse<CisResponseEntity>> res = this.restTemplate.postForEntity( this.rootURL, myRequestObj, CisResponse.class);

Me aparece este error:

Type mismatch: cannot convert from ResponseEntity<CisResponse> to ResponseEntity<CisResponse<CisResponseEntity>>

Es un error obvio, pero ¿cómo puedo solucionarlo hoy?

De lo que quiero obtener mi tipo de respuesta genérica:

CisResponse<CisResponseEntity> myResponse= res.getBody(); CisResponseEntity entity = myResponse.getEntityFromResponse();

Por ahora, utilizo esta solución, con postForObject() y no postForEntity() :

CisResponse<CisResponseEntity> response = this.restTemplate.postForObject( this.rootURL,myRequestObj, CisResponse.class);