Câu trả lời:
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: @RequestBody
javadocs, @ResponseBody
javadocs
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 @RequestBody
chú thích) và nó sẽ tuần tự hóa đối tượng được trả về thành JSON (vì bạn đã thêm @ResponseBody
chú 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.
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 :
@RestController
là một chú thích tổng hợp , chính nó được chú thích bằng meta@Controller
và@ResponseBody
để chỉ ra một bộ điều khiển có mọi phương thức kế thừa@ResponseBody
chú 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.
@RequestBody
là trên tham số, @ResponseBody
là trên phương thức. sự khác biệt quan trọng!
@ResponseBody
cả. 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.
@RequestBody
thự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!
@RestController
và đã được thay đổi khi nó được giới thiệu
@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 @Controller
chú thích. Điều này sẽ loại bỏ nhu cầu sử dụng @ResponseBody
.
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.
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 .... .
@ResponseBody
chú 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.