Gibt nur eine Zeichenfolgenmeldung vom Spring MVC 3 Controller zurück

93

Kann mir jemand sagen, wie ich eine String-Nachricht vom Controller zurückgeben kann?

Wenn ich nur einen String von einer Controller-Methode zurückgebe, dann behandelt spring mvc ihn als jsp-Ansichtsnamen.

user960567
quelle

Antworten:

191

Kommentieren Sie Ihre Methode im Controller mit @ResponseBody:

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

Von: 15.3.2.6 Zuordnen des Antwortkörpers mit der @ResponseBodyAnmerkung :

Die @ResponseBodyAnmerkung [...] kann in eine Methode eingefügt werden und gibt an, dass der Rückgabetyp direkt in den HTTP-Antworttext geschrieben (und nicht in ein Modell eingefügt oder als Ansichtsname interpretiert werden soll).

Tomasz Nurkiewicz
quelle
27
Um es klarer zu machen, würde ich produzieren = "text / plain @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322
Die eigentliche Antwort ist immer in den Kommentaren.
Johannes Stadler
48

In Spring 4 benötigen Sie die Anmerkung nicht , wenn Ihr Controller mit @RestControllerstatt kommentiert ist .@Controller@ResponseBody

Der Code wäre

@RestController
public class FooController {

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

}

Den Javadoc finden Sie @RestController hier

geoand
quelle
Vielen Dank, dies hat mir geholfen herauszufinden, dass ich \ @Controller anstelle von \ @RestController verwenden musste, um eine Ansicht anstelle eines Strings zurückzugeben.
Chriskooper
@khriskooper froh, es zu hören :)
Geoand
18

Obwohl @Tomasz absolut richtig ist, gibt es einen anderen Weg:

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

Die erste Methode ist jedoch vorzuziehen. Sie können diese Methode verwenden, wenn Sie eine Antwort mit einem benutzerdefinierten Inhaltstyp oder einen Binärtyp (Datei usw.) zurückgeben möchten.

danny.lesnik
quelle
Nur ein Kopf hoch, aber Sie müssen nicht einmal die Antwort darauf ziehen.
Scott
Damit können Sie für den zweiten Punkt, in dem Sie einen benutzerdefinierten Inhaltstyp festlegen oder einen Binärtyp zurückgeben müssen, die ResponseEntity weiterhin für diese Mittel verwenden.
Scott
6

Dies ist nur ein Hinweis für diejenigen, die diese Frage möglicherweise später finden, aber Sie müssen die Antwort nicht abrufen, um den Inhaltstyp zu ändern. Hier ist ein Beispiel, um genau das zu tun:

@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
quelle
3

Wie wäre es mit:

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

Das woks für mich.

Dimitris
quelle
3

Zur Ausgabe Stringals text/plainVerwendung:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
MariuszS
quelle
1
Das hat bei mir nicht funktioniert. Ich musste das Antwortobjekt abrufen und den Inhaltstyp explizit festlegen, bevor ich das String-Objekt zurückgab.
Pedro Madrid