Zwraca tylko wiadomość tekstową z kontrolera Spring MVC 3

95

Czy ktoś może mi powiedzieć, jak mogę zwrócić wiadomość tekstową z kontrolera?

Jeśli po prostu zwrócę ciąg z metody kontrolera, to spring mvc traktuje go jako nazwę widoku jsp.

user960567
źródło

Odpowiedzi:

194

Opisz swoją metodę w kontrolerze za pomocą @ResponseBody:

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

Od: 15.3.2.6 Odwzorowanie treści odpowiedzi z @ResponseBodyadnotacją :

@ResponseBodyAdnotacja [...] można umieścić na metody i wskazuje, że typ zwracany powinien być napisany prosto do korpusu odpowiedzi HTTP (a nie umieszczone w modelu, lub interpretowane jako nazwa widzenia).

Tomasz Nurkiewicz
źródło
27
Aby było jaśniej, dodałbym, że produkuje = "text / plain @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322
Prawdziwa odpowiedź jest zawsze w komentarzach.
Johannes Stadler
49

W Spring 4, jeśli twój kontroler jest oznaczony @RestControllerzamiast @Controller, nie potrzebujesz @ResponseBodyadnotacji.

Kod byłby

@RestController
public class FooController {

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

}

Dokument Javadoc można znaleźć @RestController tutaj

geoand
źródło
Dzięki, to pomogło mi dowiedzieć się, że muszę użyć \ @Controller zamiast \ @RestController, aby zwrócić widok, a nie String.
khriskooper
@khriskooper miło to słyszeć :)
geoand
18

Chociaż @Tomasz ma całkowitą rację, jest inny sposób:

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

ale pierwsza metoda jest lepsza. Możesz użyć tej metody, jeśli chcesz zwrócić odpowiedź z niestandardowym typem zawartości lub zwrócić typ binarny (plik itp.);

danny.lesnik
źródło
Tylko jedno ostrzeżenie, ale nie musisz nawet wyciągać w tym celu odpowiedzi.
Scott,
Oznaczało to, że w drugim punkcie, dotyczącym konieczności ustawienia niestandardowego typu zawartości lub zwrócenia typu binarnego, nadal możesz użyć ResponseEntity do tych środków.
Scott
6

To tylko uwaga dla tych, którzy mogą później znaleźć to pytanie, ale nie musisz wyciągać odpowiedzi, aby zmienić typ treści. Oto przykład poniżej, aby to zrobić:

@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
źródło
3

Co powiesz na:

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

To mi odpowiada.

Dimitris
źródło
3

Do wyprowadzania Stringjako text/plainużycia:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
Mariusz S.
źródło
1
To nie zadziałało dla mnie. Musiałem pobrać obiekt odpowiedzi i jawnie ustawić typ zawartości przed zwróceniem obiektu String.
Pedro Madrid