102 votes

Renvoyer uniquement un message sous forme de chaîne de caractères à partir du contrôleur Spring MVC 3

Quelqu'un peut-il me dire comment je peux renvoyer un message sous forme de chaîne de caractères à partir d'un contrôleur ?

Si je renvoie une chaîne de caractères à partir d'une méthode de contrôleur, Spring Mvc la traitera comme un nom de vue jsp.

211voto

Tomasz Nurkiewicz Points 140462

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 Mise en correspondance du corps de la réponse avec le format @ResponseBody annotation :

En @ResponseBody 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).

32 votes

Pour plus de clarté, j'ajouterais produces="text/plain @RequestMapping(value="/controller", method=GET, produces="text/plain")

0 votes

La vraie réponse se trouve toujours dans les commentaires.

51voto

geoand Points 10879

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

Le code serait le suivant

@RestController
public class FooController {

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

}

Vous pouvez trouver la Javadoc pour @RestController ici

0 votes

Merci, cela m'a aidé à comprendre que je devais utiliser \@Controller au lieu de \@RestController afin de retourner une vue plutôt qu'une chaîne.

0 votes

@khriskooper heureux de l'entendre :)

18voto

danny.lesnik Points 9526

Cependant, @Tomasz a tout à fait raison de dire qu'il y a une autre façon de procéder :

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

0 votes

Je vous signale que vous n'avez même pas besoin de tirer la réponse pour cela.

0 votes

En ce qui concerne le deuxième point, à savoir la nécessité de définir un type de contenu personnalisé ou de renvoyer un type binaire, vous pouvez toujours utiliser l'entité ResponseEntity à cette fin.

6voto

Scott Points 2548

C'est juste une note pour ceux qui pourraient trouver cette question plus tard, mais vous n'avez pas besoin de tirer dans la réponse pour changer le type de contenu. Voici un exemple qui permet justement de 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);
}

3voto

Dimitris Points 126

Qu'en est-il ?

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

Cela fonctionne pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X