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

94

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

Si je retourne juste une chaîne à partir d'une méthode de contrôleur, alors spring mvc la traite comme un nom de vue jsp.

user960567
la source

Réponses:

192

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

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

From: 15.3.2.6 Mappage du corps de la réponse avec l' @ResponseBodyannotation :

L' @ResponseBodyannotation [...] peut être placée 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, ou interprété comme un nom de vue).

Tomasz Nurkiewicz
la source
27
Pour rendre les choses plus claires, j'ajouterais produit = "text / plain @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322
La vraie réponse est toujours dans les commentaires.
Johannes Stadler le
49

Avec Spring 4, si votre contrôleur est annoté avec @RestControllerau lieu de @Controller, vous n'avez pas besoin de l' @ResponseBodyannotation.

Le code serait

@RestController
public class FooController {

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

}

Vous pouvez trouver le Javadoc @RestController ici

geoand
la source
Merci, cela m'a aidé à comprendre que je devais utiliser \ @Controller au lieu de \ @RestController afin de renvoyer une vue, plutôt qu'une chaîne.
khriskooper
@khriskooper heureux de l'entendre :)
geoand
18

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 renvoyer un type binaire (fichier, etc ...);

danny.lesnik
la source
Juste un avertissement, mais vous n'avez même pas besoin de tirer la réponse pour cela.
Scott
Signifie que pour le deuxième point, à propos de la nécessité de définir un type de contenu personnalisé ou de renvoyer un type binaire, vous pouvez toujours utiliser ResponseEntity pour ces moyens.
Scott
6

Ceci est juste une note pour ceux qui pourraient trouver cette question plus tard, mais vous n'avez pas à extraire 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);
}
Scott
la source
3

Qu'en est-il de:

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

Ce woks pour moi.

Dimitris
la source
3

Pour la sortie Stringcomme text/plainutilisation:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
MariuszS
la source
1
Cela n'a pas fonctionné pour moi. Je devais obtenir l'objet de réponse et définir explicitement le type de contenu avant de renvoyer l'objet String.
Pedro Madrid