Restituisce solo un messaggio stringa dal controller Spring MVC 3


93

Qualcuno può dirmi come posso restituire un messaggio di stringa dal controller?

Se restituisco solo una stringa da un metodo controller, Spring mvc lo considera come un nome di visualizzazione jsp.

Risposte:


191

Annota il tuo metodo nel controller con @ResponseBody:

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

Da: 15.3.2.6 Mappatura del corpo della risposta con l' @ResponseBodyannotazione :

L' @ResponseBodyannotazione può [...] essere inserita in un metodo e indica che il tipo restituito deve essere scritto direttamente nel corpo della risposta HTTP (e non inserito in un modello, o interpretato come un nome di visualizzazione).


27
Per renderlo più chiaro, aggiungerei produce = "text / plain @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322

La vera risposta è sempre nei commenti.
Johannes Stadler

48

Con Spring 4, se il tuo controller è annotato con @RestControllerinvece di @Controller, non hai bisogno @ResponseBodydell'annotazione.

Il codice sarebbe

@RestController
public class FooController {

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

}

Puoi trovare Javadoc per @RestController qui


Grazie, questo mi ha aiutato a capire che dovevo usare \ @Controller invece di \ @RestController per restituire una vista, piuttosto che una stringa.
khriskooper

@khriskooper felice di sentirlo :)
geoand

18

Anche se @Tomasz ha assolutamente ragione, c'è un altro modo:

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

ma il primo metodo è preferibile. È possibile utilizzare questo metodo se si desidera restituire una risposta con un tipo di contenuto personalizzato o restituire un tipo binario (file, ecc ...);


Solo un avvertimento, ma non è nemmeno necessario inserire la risposta per questo.
Scott

Significava che per il secondo punto, sulla necessità di impostare un tipo di contenuto personalizzato o sulla restituzione di un tipo binario, è comunque possibile utilizzare ResponseEntity per questi mezzi.
Scott

6

Questa è solo una nota per coloro che potrebbero trovare questa domanda in seguito, ma non è necessario inserire la risposta per modificare il tipo di contenuto. Ecco un esempio di seguito per fare proprio questo:

@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

Che dire:

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

Questo va bene per me.


3

Per l'output Stringcome text/plainuso:

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

1
Questo non ha funzionato per me. Ho dovuto ottenere l'oggetto risposta e impostare esplicitamente il tipo di contenuto prima di restituire l'oggetto String.
Pedro Madrid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.