जवाबों:
डॉक्स में एक पूरी धारा है, जिसे 16.3.3.4 कहा जाता है, @RequestBody एनोटेशन के साथ अनुरोध निकाय को मैप करना । और एक ने 16.3.3.5 पर प्रतिक्रिया बॉडी को @ResponseBody एनोटेशन के साथ मैपिंग कहा । मेरा सुझाव है कि आप उन वर्गों से परामर्श करें। इसके अलावा प्रासंगिक: @RequestBody
javadocs, @ResponseBody
javadocs
उपयोग के उदाहरण कुछ इस तरह होंगे:
JQuery जैसी जावास्क्रिप्ट-लाइब्रेरी का उपयोग करते हुए, आप इस तरह एक JSON- ऑब्जेक्ट पोस्ट करेंगे:
{ "firstName" : "Elmer", "lastName" : "Fudd" }
आपकी नियंत्रक विधि इस तरह दिखाई देगी:
// 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
}
अब यदि आपके पास जैक्सन है आपके क्लासपाथ पर (और एक <mvc:annotation-driven>
सेटअप है), तो स्प्रिंग आने वाली JSON को पोस्ट बॉडी से एक यूजरस्टैट्स ऑब्जेक्ट में बदल देगा (क्योंकि आपने @RequestBody
एनोटेशन जोड़ा है ) और यह JSON को लौटी हुई वस्तु को अनुक्रमित करेगा (क्योंकि इसे जोड़ा गया है) @ResponseBody
एनोटेशन)। इसलिए ब्राउज़र / क्लाइंट इस JSON परिणाम को देखेंगे:
{ "description" : "Elmer Fudd hates wacky wabbits" }
पूरा काम करने के उदाहरण के लिए मेरा यह पिछला जवाब देखें: https://stackoverflow.com/a/5908632/342852
नोट: RequestBody / ResponseBody बेशक JSON तक सीमित नहीं है, दोनों सादे पाठ और XML सहित कई प्रारूपों को संभाल सकते हैं, लेकिन JSON शायद सबसे अधिक उपयोग किया जाने वाला प्रारूप है।
कभी वसंत 4.x के बाद से, आप आमतौर @ResponseBody
पर विधि के स्तर पर उपयोग नहीं करेंगे , बल्कि @RestController
कक्षा स्तर पर, उसी प्रभाव के साथ।
यहाँ आधिकारिक स्प्रिंग MVC प्रलेखन से एक उद्धरण है :
@RestController
एक रचनाबद्ध एनोटेशन है जो स्वयं मेटा-एनोटेट है@Controller
और@ResponseBody
एक नियंत्रक को इंगित करने के लिए जिसका प्रत्येक तरीका टाइप-स्तरीय@ResponseBody
एनोटेशन विरासत में मिला है और इसलिए, प्रतिक्रिया बॉडी बनाम व्यू रिज़ॉल्यूशन और HTML टेम्पलेट के साथ रेंडर करने के लिए सीधे प्रतिक्रिया बॉडी को लिखता है।
@RequestBody
पैरामीटर @ResponseBody
पर है, विधि पर है। महत्वपूर्ण अंतर!
@ResponseBody
। जैसा कि आपने अभी कहा, @RequestBody
पैरामीटर पर जाता है, है ना? लेकिन उपर्युक्त उत्तर में, आपके पास यह विधि है।
@RequestBody
वास्तव में अभी भी आवश्यक है, @ResponseBody
का उपयोग करते समय निहित है @RestController
। Pls अपने उत्तर को सही करें, यह बहुत सारे अपवित्र हैं झूठे होने के लिए!
@RestController
और इसे पेश किए जाने पर बदल दिया गया था
@RequestBody : एक विधि पैरामीटर को इंगित करने वाला एनोटेशन HTTP अनुरोध के मुख्य भाग से जुड़ा होना चाहिए।
उदाहरण के लिए:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
@ResponseBody एनोटेशन को एक विधि पर रखा जा सकता है और यह इंगित करता है कि रिटर्न प्रकार को सीधे HTTP प्रतिसाद बॉडी पर लिखा जाना चाहिए (और एक मॉडल में नहीं रखा जाना चाहिए, या एक दृश्य नाम के रूप में व्याख्या की जाए)।
उदाहरण के लिए:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public @ResponseBody String helloWorld() {
return "Hello World";
}
वैकल्पिक रूप से, हम एनोटेशन के स्थान पर @RestController एनोटेशन का उपयोग कर सकते हैं @Controller
। यह उपयोग करने की आवश्यकता को हटा देगा @ResponseBody
।
नीचे जावा नियंत्रक में एक विधि का एक उदाहरण है।
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
@RequestBody एनोटेशन का उपयोग करके आप किसी भी विशिष्ट कॉल को संभालने के लिए अपने सिस्टम में आपके द्वारा बनाए गए मॉडल के साथ मैप किए गए अपने मूल्यों को प्राप्त करेंगे। @ResponseBody का उपयोग करते हुए आप कुछ भी उस स्थान पर वापस भेज सकते हैं जहाँ से अनुरोध उत्पन्न हुआ था। दोनों चीजों को बिना किसी कस्टम पार्सर आदि के आसानी से लिखा जा सकेगा।
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;
}
}
उपरोक्त उदाहरण में वे सभी उपयोगकर्ता और विशेष आईडी विवरण प्रदर्शित करने जा रहे हैं अब मैं आईडी और नाम दोनों का उपयोग करना चाहता हूं,
1) लोकलहोस्ट: 8093 / प्लेजसन / शॉप / यूजर <--- इस लिंक में सभी यूजर डिटेल्स प्रदर्शित होंगे
2) लोकलहोस्ट: 8093 / प्लेजसन / शॉप / यूजर / 11 <---- अगर मैं लिंक साधनों में 11 का उपयोग करता हूं, तो यह विशेष उपयोगकर्ता 11 विवरण प्रदर्शित करें
अब मैं आईडी और नाम दोनों का उपयोग करना चाहता हूं
लोकलहोस्ट: 8093 / plejson / shop / user / 11 / raju <----------------- इसका मतलब है कि हम इसमें से किसी का भी उपयोग कर सकते हैं कृपया मेरी मदद करें ...। ।
@ResponseBody
पैरामीटर पर एनोटेशन का उपयोग किया है , विधि का नहीं। मुझे त्रुटियों को विधि पर रखने की कोशिश कर रहा हूं, इसलिए मैं मान रहा हूं कि आपका अन्य उत्तर सही है। मुझे लगता है कि आपकोgetDescription(@RequestBody UserStats stats)
ऊपर होना चाहिए ।