Chú thích @RequestBody và @ResponseBody vào mùa xuân


138

Ai đó có thể giải thích @RequestBody@ResponseBodychú thích trong Mùa xuân 3 không? Họ để làm gì? Bất kỳ ví dụ sẽ là tuyệt vời.

Câu trả lời:


218

Có toàn bộ Phần trong các tài liệu có tên 16.3.3.4 Ánh xạ phần thân yêu cầu với chú thích @RequestBody . Và một người được gọi là 16.3.3.5 Ánh xạ cơ quan phản hồi với chú thích @ResponseBody . Tôi đề nghị bạn tham khảo những phần đó. Cũng có liên quan: @RequestBodyjavadocs, @ResponseBodyjavadocs

Ví dụ sử dụng sẽ là một cái gì đó như thế này:

Sử dụng thư viện JavaScript như JQuery, bạn sẽ đăng một đối tượng JSON như thế này:

{ "firstName" : "Elmer", "lastName" : "Fudd" }

Phương thức điều khiển của bạn sẽ trông như thế này:

// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
    return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}

// domain / value objects
public class UserStats{
    private String firstName;
    private String lastName;
    // + getters, setters
}
public class Description{
    private String description;
    // + getters, setters, constructor
}

Bây giờ nếu bạn có Jackson trên đường dẫn lớp (và có <mvc:annotation-driven>thiết lập), Spring sẽ chuyển đổi JSON đến thành đối tượng UserStats từ thân bài (vì bạn đã thêm @RequestBodychú thích) và nó sẽ tuần tự hóa đối tượng được trả về thành JSON (vì bạn đã thêm @ResponseBodychú thích). Vì vậy, Trình duyệt / Máy khách sẽ thấy kết quả JSON này:

{ "description" : "Elmer Fudd hates wacky wabbits" }

Xem câu trả lời trước đây của tôi để biết ví dụ hoạt động hoàn chỉnh: https://stackoverflow.com/a/5908632/342852

Lưu ý: RequestBody / FeedbackBody tất nhiên không giới hạn ở JSON, cả hai đều có thể xử lý nhiều định dạng, bao gồm cả văn bản thuần túy và XML, nhưng JSON có lẽ là định dạng được sử dụng nhiều nhất.


Cập nhật

Kể từ Mùa xuân 4.x, bạn thường không sử dụng @ResponseBodyở cấp phương thức, mà là @RestControllerở cấp độ lớp, với cùng hiệu quả.

Đây là một trích dẫn từ tài liệu chính thức của Spring MVC :

@RestControllerlà một chú thích tổng hợp , chính nó được chú thích bằng meta@Controller@ResponseBodyđể chỉ ra một bộ điều khiển có mọi phương thức kế thừa @ResponseBodychú thích cấp độ và do đó, ghi trực tiếp vào phần thân phản hồi so với độ phân giải xem và hiển thị bằng mẫu HTML.


Trong câu trả lời được liên kết của bạn, bạn đã sử dụng @ResponseBodychú thích trên tham số, không phải phương thức. Tôi gặp lỗi khi cố gắng đưa nó vào phương thức, vì vậy tôi cho rằng câu trả lời khác của bạn là đúng. Tôi nghĩ bạn nên có getDescription(@RequestBody UserStats stats)ở trên.
Patrick

3
@Patrick không, @RequestBodylà trên tham số, @ResponseBodylà trên phương thức. sự khác biệt quan trọng!
Sean Patrick Floyd

1
@SeanPatrickFloyd Xin lỗi, tôi không có ý đề cập gì @ResponseBodycả. Như bạn vừa nói, @RequestBodyđi vào tham số, phải không? Nhưng trong câu trả lời trên, bạn có nó về phương pháp.
Patrick

1
@SeanPatrickFloyd @RequestBodythực sự vẫn được yêu cầu, @ResponseBodyẩn khi sử dụng @RestController. Xin sửa câu trả lời của bạn, nó có quá nhiều upvote là sai!
Sumit Jain

@SumitJain để công bằng: câu trả lời này đã có từ trước @RestControllervà đã được thay đổi khi nó được giới thiệu
Sean Patrick Floyd

32

@RequestBody : Chú thích chỉ ra một tham số phương thức nên được liên kết với phần thân của yêu cầu HTTP.

Ví dụ:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}

Chú thích @ResponseBody có thể được đặt trên một phương thức và chỉ ra rằng kiểu trả về phải được ghi thẳng vào phần phản hồi HTTP (và không được đặt trong Mô hình hoặc được hiểu là tên dạng xem).

Ví dụ:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public  @ResponseBody String helloWorld() {
    return "Hello World";
}  

Ngoài ra, chúng ta có thể sử dụng chú thích @RestControll thay cho @Controllerchú thích. Điều này sẽ loại bỏ nhu cầu sử dụng @ResponseBody.

để biết thêm chi tiết


5

Dưới đây là một ví dụ về một phương thức trong bộ điều khiển Java.

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel) 
{
    return HttpStatus.OK;
}

Bằng cách sử dụng chú thích @RequestBody, bạn sẽ có được các giá trị của mình được ánh xạ với mô hình bạn đã tạo trong hệ thống để xử lý bất kỳ cuộc gọi cụ thể nào. Trong khi bằng cách sử dụng @ResponseBody, bạn có thể gửi mọi thứ trở lại nơi yêu cầu được tạo. Cả hai thứ sẽ được ánh xạ dễ dàng mà không cần viết bất kỳ trình phân tích cú pháp tùy chỉnh, v.v.


1
package com.programmingfree.springshop.controller;

import java.util.List;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;


@RestController
@RequestMapping("/shop/user")
public class SpringShopController {

 UserShop userShop=new UserShop();

 @RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
 public User getUser(@PathVariable int id) {
  User user=userShop.getUserById(id);
  return user;
 }


 @RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
 public List<User> getAllUsers() {
  List<User> users=userShop.getAllUsers();
  return users;
 }


}

Trong ví dụ trên, họ sẽ hiển thị tất cả các chi tiết id người dùng và cụ thể bây giờ tôi muốn sử dụng cả id và tên,

1) localhost: 8093 / plejson / shop / user <--- liên kết này sẽ hiển thị tất cả chi tiết người dùng
2) localhost: 8093 / plejson / shop / user / 11 <---- nếu tôi sử dụng 11 trong liên kết nghĩa là nó sẽ hiển thị 11 chi tiết cụ thể của người dùng

bây giờ tôi muốn sử dụng cả id và name

localhost: 8093 / plejson / shop / user / 11 / raju <----------------- như thế này có nghĩa là chúng tôi có thể sử dụng bất kỳ cái nào trong này xin vui lòng giúp tôi .... .


Vui lòng sửa định dạng của câu trả lời và mẫu mã.
Maciej Lach

Vui lòng mô tả cách mã này giúp người hỏi. Cảm ơn bạn.
Leonid Glanz


lập trình- free.com / 2014/03 / từ ....................................... .................................................. ..... đi qua liên kết này bạn sẽ nhận được lời cảm ơn
user5409646
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.