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.

user960567
fuente

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).

Tomasz Nurkiewicz
fuente
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í

geo y
fuente
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.);

danny.lesnik
fuente
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);
}
Scott
fuente
3

Qué pasa:

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

Esto funciona para mí.

Dimitris
fuente
3

Para la salida Stringcomo text/plainuso:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
MariuszS
fuente
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