responsebody requestmapping requestbody mvc example body json spring-mvc jackson

json - requestmapping - spring post request body example



spring mvc restcontroller return json string (3)

Prueba esto:

@RequestMapping(value = "/stringtest", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)

Tengo un controlador Spring MVC con el siguiente método:

@RequestMapping(value = "/stringtest", method = RequestMethod.GET) public String simpletest() throws Exception { return "test"; }

Esto se encuentra dentro de un controlador que comienza así:

@RestController @RequestMapping(value = "/root") public class RootController

Cuando llamo a otros métodos que devuelven objetos, Jackson los serializa en JSON. Pero este método que devuelve una cadena no se convierte a JSON. En caso de que no esté claro, aquí hay un ejemplo usando curl:

$curl http://localhost:8080/clapi/root/stringtest test

Entonces, el problema es que "prueba" sin comillas no es una cadena JSON, pero mi cliente REST espera una cadena. Esperé que el comando curl para mostrar esa cadena con comillas a su alrededor por lo que es JSON legal en su lugar:

"test"

Estoy usando Spring WebMVC 4.1.3 y Jackson 2.4.3. He intentado agregar un atributo "produce" a RequestMapping para decir que debe devolver JSON. En este caso, el atributo Content-Type devuelto es "application / json" pero aún así la cadena de prueba no se cita.

Podría solucionar esto llamando a una biblioteca JSON para convertir Java String a JSON, pero parece que Spring MVC y Jackson generalmente lo hacen automáticamente. Sin embargo, de alguna manera no lo están haciendo en mi caso. ¿Alguna idea de lo que podría haber configurado mal para obtener solo una prueba en lugar de "prueba"?


Pruebe algo como esto

@RequestMapping(value = "/stringtest", method = RequestMethod.GET, produces="application/json") public @ResponseBody String simpletest() throws Exception { return "test"; }


Resulta que cuando usas la anotación @EnableWebMvc , activa por defecto un conjunto de convertidores de mensajes http. El segundo en la lista es StringHttpMessageConverter que según la documentación se aplicará a text/* tipos de contenido text/* . Sin embargo, después de avanzar con el depurador, se aplica a los objetos String para los tipos de contenido */* , que obviamente incluye application/json .

El MappingJackson2HttpMessageConverter que es responsable de los tipos de contenido de application/json está más abajo en esta lista. Entonces, para los objetos de Java que no sean String, se llama a este. Es por eso que funcionaba para tipos Object y Array, pero no para String, a pesar de las buenas sugerencias de usar el atributo produce para establecer el tipo de contenido application/json . A pesar de que ese tipo de contenido es necesario para activar este convertidor, ¡el convertidor String fue el primero en tomar el trabajo!

Como estaba ampliando la clase WebMvcConfigurationSupport para alguna otra configuración, anulé el siguiente método para poner primero el convertidor Jackson, de modo que cuando el tipo de contenido sea application/json , se usará este en lugar del convertidor String:

@Override protected void configureMessageConverters( List<HttpMessageConverter<?>> converters) { // put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON converters.add(new MappingJackson2HttpMessageConverter()); // and probably needs a string converter too for text/plain content-type strings to be properly handled converters.add(new StringHttpMessageConverter()); }

Ahora, cuando llamo al método de prueba desde curl, obtengo el resultado deseado de "test" lugar de solo la test , por lo que el cliente angular que está esperando JSON ahora está contento.