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.

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


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


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


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

3

Bagaimana dengan:

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

Ini wajan untukku.


3

Untuk keluaran Stringsebagai text/plaindigunakan:

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

1
Ini tidak berhasil untuk saya. Saya harus mendapatkan objek respon dan secara eksplisit mengatur tipe konten sebelum mengembalikan objek String.
Pedro Madrid
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.