वसंत में @RequestBody और @ResponseBody के उद्घोष


139

क्या कोई स्प्रिंग 3 में व्याख्या @RequestBodyऔर व्याख्या कर सकता है @ResponseBody? यह किस लिए हैं? कोई भी उदाहरण बहुत अच्छा होगा।

जवाबों:


219

डॉक्स में एक पूरी धारा है, जिसे 16.3.3.4 कहा जाता है, @RequestBody एनोटेशन के साथ अनुरोध निकाय को मैप करना । और एक ने 16.3.3.5 पर प्रतिक्रिया बॉडी को @ResponseBody एनोटेशन के साथ मैपिंग कहा । मेरा सुझाव है कि आप उन वर्गों से परामर्श करें। इसके अलावा प्रासंगिक: @RequestBodyjavadocs, @ResponseBodyjavadocs

उपयोग के उदाहरण कुछ इस तरह होंगे:

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 टेम्पलेट के साथ रेंडर करने के लिए सीधे प्रतिक्रिया बॉडी को लिखता है।


आपके लिंक किए गए उत्तर में, आपने @ResponseBodyपैरामीटर पर एनोटेशन का उपयोग किया है , विधि का नहीं। मुझे त्रुटियों को विधि पर रखने की कोशिश कर रहा हूं, इसलिए मैं मान रहा हूं कि आपका अन्य उत्तर सही है। मुझे लगता है कि आपको getDescription(@RequestBody UserStats stats)ऊपर होना चाहिए ।
पैट्रिक

3
@Patrick नहीं, @RequestBodyपैरामीटर @ResponseBodyपर है, विधि पर है। महत्वपूर्ण अंतर!
शॉन पैट्रिक फ्लोयड

1
@SeanPatrickFloyd क्षमा करें, मेरा उल्लेख बिल्कुल नहीं था @ResponseBody। जैसा कि आपने अभी कहा, @RequestBodyपैरामीटर पर जाता है, है ना? लेकिन उपर्युक्त उत्तर में, आपके पास यह विधि है।
पैट्रिक

1
@SeanPatrickFloyd @RequestBodyवास्तव में अभी भी आवश्यक है, @ResponseBodyका उपयोग करते समय निहित है @RestController। Pls अपने उत्तर को सही करें, यह बहुत सारे अपवित्र हैं झूठे होने के लिए!
सुमित जैन

@SumitJain निष्पक्ष होना: यह उत्तर पहले के आसपास था @RestControllerऔर इसे पेश किए जाने पर बदल दिया गया था
सीन पैट्रिक फ्लॉयड

32

@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

अधिक जानकारी के लिए


5

नीचे जावा नियंत्रक में एक विधि का एक उदाहरण है।

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

@RequestBody एनोटेशन का उपयोग करके आप किसी भी विशिष्ट कॉल को संभालने के लिए अपने सिस्टम में आपके द्वारा बनाए गए मॉडल के साथ मैप किए गए अपने मूल्यों को प्राप्त करेंगे। @ResponseBody का उपयोग करते हुए आप कुछ भी उस स्थान पर वापस भेज सकते हैं जहाँ से अनुरोध उत्पन्न हुआ था। दोनों चीजों को बिना किसी कस्टम पार्सर आदि के आसानी से लिखा जा सकेगा।


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;
 }


}

उपरोक्त उदाहरण में वे सभी उपयोगकर्ता और विशेष आईडी विवरण प्रदर्शित करने जा रहे हैं अब मैं आईडी और नाम दोनों का उपयोग करना चाहता हूं,

1) लोकलहोस्ट: 8093 / प्लेजसन / शॉप / यूजर <--- इस लिंक में सभी यूजर डिटेल्स प्रदर्शित होंगे
2) लोकलहोस्ट: 8093 / प्लेजसन / शॉप / यूजर / 11 <---- अगर मैं लिंक साधनों में 11 का उपयोग करता हूं, तो यह विशेष उपयोगकर्ता 11 विवरण प्रदर्शित करें

अब मैं आईडी और नाम दोनों का उपयोग करना चाहता हूं

लोकलहोस्ट: 8093 / plejson / shop / user / 11 / raju <----------------- इसका मतलब है कि हम इसमें से किसी का भी उपयोग कर सकते हैं कृपया मेरी मदद करें ...। ।


कृपया उत्तर और कोड नमूने का सही प्रारूपण करें।
मैकीज लाच

कृपया बताएं कि यह कोड प्रश्नकर्ता की मदद कैसे करता है। धन्यवाद।
लियोनिद ग्लान्ज़


प्रोग्रामिंग- free.com/2014/03/… …………………………………। .................................................. ..... इस लिंक पर जाएं u आपको धन्यवाद मिलेगा
user5409646
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.