Kembalikan hanya pesan string dari Spring MVC 3 Controller

94

Adakah yang bisa memberi tahu saya bagaimana saya bisa mengembalikan pesan string dari pengontrol?

Jika saya hanya mengembalikan string dari metode pengontrol maka pegas MVC memperlakukannya sebagai nama tampilan jsp.

pengguna960567
sumber

Jawaban:

192

Membubuhi keterangan metode Anda di controller dengan @ResponseBody:

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

Dari: 15.3.2.6 Memetakan isi tanggapan dengan @ResponseBodyanotasi :

The @ResponseBodypenjelasan [...] dapat diletakkan pada metode dan menunjukkan bahwa tipe kembali harus ditulis langsung ke tubuh respon HTTP (dan tidak ditempatkan dalam Model, atau ditafsirkan sebagai nama tampilan).

Tomasz Nurkiewicz
sumber
27
Untuk membuatnya lebih jelas, saya akan menambahkan @RequestMapping(value="/controller", method=GET, produces="text/plain")
generated
Jawaban sebenarnya selalu ada di komentar.
Johannes Stadler
49

Dengan Spring 4, jika Pengontrol Anda diberi anotasi, @RestControllerbukan @Controller, Anda tidak memerlukan @ResponseBodyanotasi tersebut.

Kodenya adalah

@RestController
public class FooController {

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

}

Anda dapat menemukan Javadoc @RestController di sini

geoand
sumber
Terima kasih, ini membantu saya mengetahui bahwa saya perlu menggunakan \ @Controller daripada \ @RestController untuk mengembalikan tampilan, daripada String.
khriskooper
@ Khriskooper senang mendengarnya :)
geo dan
18

Meskipun, @Tomasz benar, ada cara lain:

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

tetapi metode pertama lebih disukai. Anda dapat menggunakan metode ini jika Anda ingin mengembalikan respons dengan tipe konten kustom atau mengembalikan tipe biner (file, dll ...);

danny.lesnik
sumber
Hanya pemberitahuan, tetapi Anda bahkan tidak perlu menarik tanggapan untuk ini.
Scott
Artinya untuk poin kedua, tentang perlunya menyetel tipe konten kustom atau mengembalikan tipe biner, Anda masih bisa menggunakan ResponseEntity untuk cara tersebut.
Scott
6

Ini hanya catatan bagi mereka yang mungkin menemukan pertanyaan ini nanti, tetapi Anda tidak perlu menarik respons untuk mengubah jenis konten. Berikut adalah contoh di bawah ini untuk melakukannya:

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

Bagaimana dengan:

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

Ini wajan untukku.

Dimitris
sumber
3

Untuk keluaran Stringsebagai text/plaindigunakan:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}
MariuszS
sumber
1
Ini tidak berhasil untuk saya. Saya harus mendapatkan objek respon dan secara eksplisit mengatur tipe konten sebelum mengembalikan objek String.
Pedro Madrid