Devuelve solo el mensaje de cadena del controlador Spring MVC 3


94

¿Alguien puede decirme cómo puedo devolver un mensaje de cadena desde el controlador?

Si solo devuelvo una cadena de un método de controlador, spring mvc lo trata como un nombre de vista jsp.

Respuestas:


192

Anote su método en el controlador con @ResponseBody:

@RequestMapping(value="/controller", method=GET)
@ResponseBody
public String foo() {
    return "Response!";
}

De: 15.3.2.6 Mapeo del cuerpo de la respuesta con la @ResponseBodyanotación :

La @ResponseBodyanotación se puede [...] poner en un método e indica que el tipo de retorno debe escribirse directamente en el cuerpo de respuesta HTTP (y no colocarse en un modelo, ni interpretarse como un nombre de vista).


27
Para hacerlo más claro, agregaría produce = "text / plain @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322

La verdadera respuesta está siempre en los comentarios.
Johannes Stadler

49

Con Spring 4, si su controlador está anotado con en @RestControllerlugar de @Controller, no necesita la @ResponseBodyanotación.

El código sería

@RestController
public class FooController {

   @RequestMapping(value="/controller", method=GET)
   public String foo() {
      return "Response!";
   }

}

Puedes encontrar el Javadoc @RestController aquí


Gracias, esto me ayudó a descubrir que necesitaba usar \ @Controller en lugar de \ @RestController para devolver una vista, en lugar de una Cadena.
khriskooper

@khriskooper me alegra escucharlo :)
geoand

18

Aunque @Tomasz tiene toda la razón, hay otra forma:

@RequestMapping(value="/controller", method=GET)
public void foo(HttpServletResponse res) {
    try {       
        PrintWriter out = res.getWriter();
        out.println("Hello, world!");
        out.close();
    } catch (IOException ex) { 
        ...
    }
}

pero es preferible el primer método. Puede utilizar este método si desea devolver una respuesta con un tipo de contenido personalizado o devolver un tipo binario (archivo, etc.);


Solo un aviso, pero ni siquiera es necesario que ingreses la respuesta para esto.
Scott

Significó que para el segundo punto, sobre la necesidad de establecer un tipo de contenido personalizado o devolver un tipo binario, aún puede usar ResponseEntity para esos medios.
Scott

6

Esta es solo una nota para aquellos que puedan encontrar esta pregunta más adelante, pero no es necesario que ingrese la respuesta para cambiar el tipo de contenido. Aquí hay un ejemplo a continuación para hacer precisamente eso:

@RequestMapping(method = RequestMethod.GET, value="/controller")
public ResponseEntity<byte[]> displayUploadedFile()
{
  HttpHeaders headers = new HttpHeaders();
  String disposition = INLINE;
  String fileName = "";
  headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

  //Load your attachment here

  if (Arrays.equals(Constants.HEADER_BYTES_PDF, contentBytes)) {
    headers.setContentType(MediaType.valueOf("application/pdf"));
    fileName += ".pdf";
  }

  if (Arrays.equals(Constants.HEADER_BYTES_TIFF_BIG_ENDIAN, contentBytes)
      || Arrays.equals(Constantsr.HEADER_BYTES_TIFF_LITTLE_ENDIAN, contentBytes)) {
    headers.setContentType(MediaType.valueOf("image/tiff"));
    fileName += ".tif";
  }

  if (Arrays.equals(Constants.HEADER_BYTES_JPEG, contentBytes)) {
    headers.setContentType(MediaType.IMAGE_JPEG);
    fileName += ".jpg";
  }

  //Handle other types if necessary

  headers.add("Content-Disposition", , disposition + ";filename=" + fileName);
  return new ResponseEntity<byte[]>(uploadedBytes, headers, HttpStatus.OK);
}

3

Qué pasa:

PrintWriter out = response.getWriter();
out.println("THE_STRING_TO_SEND_AS_RESPONSE");
return null;

Esto funciona para mí.


3

Para la salida Stringcomo text/plainuso:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}

1
Esto no funcionó para mí. Tuve que obtener el objeto de respuesta y establecer explícitamente el tipo de contenido antes de devolver el objeto String.
Pedro Madrid
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.