java - requestmapping - spring mvc español
Devolver solo el mensaje de cadena del controlador Spring MVC 3 (6)
¿Alguien puede decirme cómo puedo devolver un mensaje de cadena desde el controlador?
Si acabo de devolver una cadena desde un método de controlador, entonces mvc spring lo trata como un nombre de vista jsp.
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 el primer método es preferible. Puede usar este método si desea devolver una respuesta con un tipo de contenido personalizado o devolver un tipo binario (archivo, etc.);
Con Spring 4, si su controlador está anotado con @RestController
lugar de @Controller
, no necesita la anotación @ResponseBody
.
El código sería
@RestController
public class FooController {
@RequestMapping(value="/controller", method=GET)
public String foo() {
return "Response!";
}
}
Puede encontrar el Javadoc para @RestController
here
Esta es solo una nota para quienes puedan encontrar esta pregunta más adelante, pero no es necesario que extraiga la respuesta para cambiar el tipo de contenido. Aquí hay un ejemplo a continuación para hacer justamente 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);
}
Para la salida de String
como text/plain
uso text/plain
:
@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
return "bar";
}
Qué pasa:
PrintWriter out = response.getWriter();
out.println("THE_STRING_TO_SEND_AS_RESPONSE");
return null;
Esto funciona para mí.
Anota tu método en el controlador con @ResponseBody
:
@RequestMapping(value="/controller", method=GET)
@ResponseBody
public String foo() {
return "Response!";
}
De: 15.3.2.6 Asignación del cuerpo de la respuesta con la anotación @ResponseBody
:
La anotación
@ResponseBody
[...] se puede poner en un método e indica que el tipo de devolución debe escribirse directamente en el cuerpo de respuesta HTTP (y no colocarse en un Modelo o interpretarse como un nombre de vista).