Retourner Seulement le message de chaîne de caractères du contrôleur MVC 3 de printemps

est-ce que quelqu'un peut me dire comment je peux retourner le message de chaîne de caractères du contrôleur?

si je renvoie juste une chaîne de caractères d'une méthode de controller alors que mvc le traite comme un nom de vue jsp.

73
demandé sur user960567 2011-10-06 14:09:43

6 réponses

annoter 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 la Cartographie du corps de la réponse avec le @ResponseBody annotation :

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

155
répondu Tomasz Nurkiewicz 2011-10-06 10:13:27

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

le code serait

@RestController
public class FooController {

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

}

vous pouvez trouver le Javadoc pour @RestController ici

38
répondu geoand 2015-09-16 09:23:20

bien que, @Tomasz ait absolument raison, il y a 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 voulez retourner la réponse avec le type de contenu personnalisé ou le type binaire de retour (fichier, etc...);

15
répondu danny.lesnik 2014-05-22 09:21:50

ce n'est qu'une note pour ceux qui pourraient trouver cette question plus tard, mais vous n'avez pas à tirer dans la réponse pour changer le type de contenu. Voici un exemple ci-dessous pour le faire:

@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
répondu Scott 2011-10-06 20:49:37

Ce sujet:

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

ça me fait mal.

3
répondu Dimitris 2014-01-13 14:30:47

Pour outputing String comme text/plain utiliser:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
2
répondu MariuszS 2014-01-13 14:36:03