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.

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


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


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


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);
}

3

Qu'en est-il de:

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

Ce woks pour moi.


3

Pour la sortie Stringcomme text/plainutilisation:

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.