2012-07-02 45 views

Trả lời

159

Có toàn bộ Phần trong tài liệu được gọi là 16.3.3.4 Mapping the request body with the @RequestBody annotation. Và một gọi là 16.3.3.5 Mapping the response body with the @ResponseBody annotation. Tôi đề nghị bạn tham khảo những phần đó. Cũng liên quan: @RequestBody javadocs, @ResponseBody javadocs

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

Sử dụng JavaScript thư viện như JQuery, bạn sẽ gửi một JSON-Object như thế này:

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

của bạn phương thức điều khiển sẽ trông giống như sau:

// 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 học (và có một thiết lập <mvc:annotation-driven>), Spring sẽ chuyển đổi JSON đến đối tượng UserStats từ phần thân bài viết (vì bạn đã thêm chú thích @RequestBody) và nó sẽ tuần tự hóa đối tượng trả về thành JSON (vì bạn đã thêm chú thích @ResponseBody). Vì vậy, trình duyệt/Khách hàng 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 cho một ví dụ làm việc hoàn chỉnh: https://stackoverflow.com/a/5908632/342852

Lưu ý: RequestBody/ResponseBody là tất nhiên không giới hạn JSON, cả hai 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 sẽ không sử dụng @ResponseBody vào mức độ phương pháp, mà là @RestController vào trình độ lớp, với tác dụng tương tự. Xem Creating REST Controllers with the @RestController annotation

+2

Cảm ơn rất nhiều @Sean – leo

+0

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

+1

@Patrick no, '@ RequestBody' nằm trong tham số,' @ ResponseBody' là phương thức. sự khác biệt quan trọng! –

0
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 chúng sẽ hiển thị tất cả người dùng và id đặc biệt chi tiết bây giờ tôi muốn sử dụng cả id và tên,

1) localhost: 8093/plejson/cửa hàng/user < - liên kết --this sẽ hiển thị tất cả các chi tiết người dùng
2) localhost: 8093/plejson/cửa hàng/người dùng/11 < ---- nếu tôi sử dụng 11 phương tiện liên kết, nó sẽ hiển thị người dùng cụ thể 11 chi tiết

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

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

+0

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

+0

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

+0

http://www.programming-free.com/2014/03/spring-mvc-40-restful-web-service-json.html .................. ..đi qua liên kết này u sẽ nhận được ... cảm ơn bạn – user5409646

15

@RequestBody: Chú thích cho biết tham số phương pháp phải được ràng buộc 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); 
} 

@ResponseBody chú 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à tên chế độ 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 @RestController chú thích ở vị trí của @Controller chú thích. Điều này sẽ loại bỏ nhu cầu sử dụng @ResponseBody.

for more details

0

Dưới đây là một ví dụ về một phương pháp trong một 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ẽ nhận được giá trị đượ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. Mặc dù bằng cách sử dụng @ResponseBody, bạn có thể gửi bất kỳ thứ gì trở lại địa điểm từ 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 nào, v.v.

Các vấn đề liên quan