web-dev-qa-db-fra.com

Renvoie uniquement le message de chaîne du contrôleur Spring MVC 3

Quelqu'un peut-il me dire comment je peux retourner un message de chaîne depuis le contrôleur?

Si je viens de retourner une chaîne à partir d'une méthode de contrôleur puis ressort MVC le traitant comme un nom de vue JSP.

84
user960567

Annotez votre méthode dans le contrôleur avec @ResponseBody:

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

De: 15.3.2.6 Mappage du corps de la réponse avec le @ResponseBody annotation :

Le @ResponseBody annotation [...] peut être placé sur une méthode et indique que le type de retour doit être écrit directement dans le corps de la réponse HTTP (et non placé dans un modèle, ni interprété comme un nom de vue).

170

Avec Spring 4, si votre contrôleur est annoté avec @RestController au lieu de @Controller, vous n'avez pas besoin du @ResponseBody annotation.

Le code serait

@RestController
public class FooController {

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

}

Vous pouvez trouver le Javadoc pour @RestControllerici

42
geoand

Bien que @Tomasz ait absolument raison, il existe un autre moyen:

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

mais la première méthode est préférable. Vous pouvez utiliser cette méthode si vous souhaitez renvoyer une réponse avec un type de contenu personnalisé ou un type binaire (fichier, etc.).

18
danny.lesnik

Ceci est juste une note pour ceux qui pourraient trouver cette question plus tard, mais vous n’avez pas besoin de saisir la réponse pour changer le type de contenu. Voici un exemple ci-dessous pour faire exactement cela:

@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);
}
5
Scott

Qu'en est-il de:

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

Cela me convient.

3
Dimitris

Pour sortir String comme text/plain utilisation:

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