Chỉ trả về thông báo chuỗi từ Bộ điều khiển Spring MVC 3


93

Bất kỳ ai có thể cho tôi biết làm thế nào tôi có thể trả lại tin nhắn chuỗi từ bộ điều khiển?

Nếu tôi chỉ trả về một chuỗi từ phương thức bộ điều khiển thì spring mvc coi nó như một tên chế độ xem jsp.

Câu trả lời:


191

Chú thích phương pháp của bạn trong bộ điều khiển với @ResponseBody:

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

Từ: 15.3.2.6 Ánh xạ nội dung phản hồi với @ResponseBodychú thích :

Các @ResponseBodychú thích [...] có thể được đặt trên một phương pháp và chỉ ra rằng kiểu trả về phải được ghi thẳng vào cơ thể phản ứng HTTP (và không được đặt trong một mô hình, hoặc hiểu là một tên xem).


27
Để làm cho nó rõ ràng hơn, tôi sẽ thêm sản xuất = "text / plain @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322

Câu trả lời thực sự luôn có trong các bình luận.
Johannes Stadler

48

Với Spring 4, nếu Bộ điều khiển của bạn được chú thích @RestControllerthay vì @Controller, bạn không cần @ResponseBodychú thích.

Mã sẽ là

@RestController
public class FooController {

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

}

Bạn có thể tìm thấy Javadoc @RestController tại đây


Cảm ơn, điều này đã giúp tôi biết mình cần sử dụng \ @Controller thay vì \ @RestController để trả về một chế độ xem thay vì một Chuỗi.
khriskooper

@khriskooper rất vui khi nghe điều đó :)
geoand

18

Mặc dù, @Tomasz hoàn toàn đúng, có một cách khác:

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

nhưng phương pháp đầu tiên là thích hợp hơn. Bạn có thể sử dụng phương pháp này nếu bạn muốn trả về phản hồi với kiểu nội dung tùy chỉnh hoặc trả về kiểu nhị phân (tệp, v.v.);


Chỉ cần một thông báo, nhưng bạn thậm chí không cần phải kéo phản hồi cho việc này.
Scott

Có nghĩa là đối với điểm thứ hai, về việc cần đặt loại nội dung tùy chỉnh hoặc trả về loại nhị phân, bạn vẫn có thể sử dụng ResponseEntity cho những phương tiện đó.
Scott

6

Đây chỉ là một lưu ý cho những người có thể tìm thấy câu hỏi này sau này, nhưng bạn không cần phải kéo câu trả lời để thay đổi loại nội dung. Đây là một ví dụ bên dưới để làm điều đó:

@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

Thế còn:

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

Cái chảo này cho tôi.


3

Để đi ra ngoài Stringnhư text/plainsử dụng:

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

1
Điều này không hiệu quả với tôi. Tôi phải lấy đối tượng phản hồi và đặt kiểu nội dung rõ ràng trước khi trả về đối tượng Chuỗi.
Pedro Madrid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.