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.

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


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


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.


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

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.


3

Zur Ausgabe Stringals text/plainVerwendung:

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.