2012-10-11 12 views
95

मैं अपने सरल स्प्रिंग एमवीसी बैकएंड में एसिंक्रोनस कॉल करने के लिए jQuery के $.getJSON() का उपयोग कर रहा हूं। स्प्रिंग नियंत्रक तरीकों में से अधिकांश इस तरह दिखेगा:क्या वसंत एमवीसी नियंत्रक विधि मूल्य वापस नहीं करता है वापस क्या करना है?

@RequestMapping(value = "/someURL", method = RequestMethod.POST) 
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget, 
    @RequestParam("type") String type) { 
    return someDAO.getSomeData(widget, type); 
} 

मैं चीजों की स्थापना की ताकि प्रत्येक नियंत्रक JSON के रूप में @ResponseBody देता है, वह राशि है जो क्लाइंट साइड की उम्मीद है।

लेकिन क्या होता है जब कोई अनुरोध क्लाइंट-साइड पर कोई सामग्री वापस नहीं करना चाहिए? क्या मेरे पास हो सकता है:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) 
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) { 
    ... 
} 

यदि नहीं, तो यहां उपयोग करने के लिए उचित वाक्यविन्यास क्या है? अग्रिम में धन्यवाद!

+0

मुझे लगता है कि अगर आप कुछ भी वापस नहीं करते हैं, तो कोई सामग्री वापस नहीं भेजी जाएगी? – arahant

+1

मुझे लगता है कि मैं अभी भी किसी प्रकार का POJO वापस कर दूंगा, भले ही आपके समाधान के संस्करण 1 में यह केवल "सफलता" बूलियन या कुछ इसी तरह से लपेटता है। फिर आपके पास अपने सभी AJAX तरीकों में एक सतत पैटर्न है, और कुछ ऐसा जो कि जब यह निकलता है तो इसे बनाने में आसान होता है * आपको * कुछ वापस करने की आवश्यकता होती है! – millhouse

+0

उत्तर क्या सुझाव हैं इसके विपरीत, आपके पहले स्निपेट में जो आपने पहले किया था वह बिल्कुल ठीक है और 'POST' डेटा को संभालने का सही तरीका है। –

उत्तर

181

आप शून्य लौट सकते हैं, तो आप @ResponseStatus साथ विधि (मूल्य = HttpStatus.OK) आप की जरूरत नहीं है चिह्नित करने के लिए है @ ResponseBody

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) 
@ResponseStatus(value = HttpStatus.OK) 
public void updateDataThatDoesntRequireClientToBeNotified(...) { 
    ... 
} 

केवल, विधियों 200 स्थिति कोड implicity वापसी प्राप्त अन्य सभी तुम क्या है तीन बातों में से एक:

  • वापसी शून्य और (मूल्य = HttpStatus.OK) @ResponseStatus साथ विधि
  • वापसी एक वस्तु चिह्नित करने और @ResponseBody साथ चिह्नित
  • वापसी एक HttpEntity उदाहरण
+2

यदि रनटाइम अपवाद के बीच में होता है, तो HTTP 500 वापस कर दिया जाएगा और 200 नहीं। इसलिए यदि आपका फ्रंट एंड हैंडल विफलता है, तो अपवाद/त्रुटि संदेश सही तरीके से प्रदर्शित किया जाएगा। –

+18

असल में, आपको '@ ResponseStatus' सेट करने की आवश्यकता नहीं है और नहीं करना चाहिए। बस 'शून्य' हैंडलर पर '@ ResponseBody' होना पर्याप्त है। –

+10

मुझे लगता है कि शून्य विधियों के लिए 200 की बजाय 204 कोई सामग्री वापस करने के लिए बेहतर होगा – raspacorp

38

आप बस उचित हेडर के साथ एक ResponseEntity लौट सकते हैं:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) 
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){ 
.... 
return new ResponseEntity(HttpStatus.OK) 
} 
+0

किसी को भी उसी समस्या में भागने में शामिल किया गया, यह वसंत के पुराने संस्करण (4.1.1) पर काम नहीं करता था, मुझे 500 त्रुटियां मिलेंगी। मैं 4.2.0 तक अपग्रेड किया गया और यह बहुत अच्छा काम करता है – sauce

+0

यह खाली 200 वापस लौटने का मेरा पसंदीदा तरीका भी है। चूंकि स्प्रिंग 4.1 इसके बजाय बिल्डर पैटर्न का उपयोग करता है: वापसी ResponseEntity.ok()। Build(); – GreenTurtle

0

लेकिन आपके सिस्टम आकार में बढ़ता है के रूप में और कार्यक्षमता ... मुझे लगता है कि हमेशा एक जेसन लौटने का कोई बुरा विचार नहीं है। एक वास्तुकला/"बड़े पैमाने पर डिजाइन" मामला है।

आप हमेशा दो JS फ़ील्ड के साथ एक JSON को पुनर्प्राप्त करने के बारे में सोच सकते हैं: कोड और डेटा। जहां कोड एक संख्यात्मक कोड होता है जो ऑपरेशन की सफलता को निर्दिष्ट करता है और डेटा ऑपरेशन/सेवा से संबंधित कोई भी अतिरिक्त डेटा है।

आओ, जब हम एक बैकएंड सेवा प्रदाता का उपयोग करते हैं, तो यह देखने के लिए किसी भी सेवा की जांच की जा सकती है कि यह अच्छी तरह से काम करता है या नहीं।

तो मैं वसंत को प्रबंधित करने के लिए, हाइब्रिड रिटर्निंग ऑपरेशंस को उजागर करने के लिए नहीं रोकता (कुछ डेटा अन्य कुछ भी नहीं लौटाता है ...) .. instaed सुनिश्चित करें कि आपका सर्वर एक और सजातीय इंटरफेस का पर्दाफाश करता है। दिन के अंत में अधिक सरल है।

2

शून्य @ResponseBody लौटने में कुछ भी गलत नहीं है और आपको POST अनुरोधों के लिए जाना चाहिए।

अपवाद हैंडलर दिनचर्या के भीतर त्रुटियों को परिभाषित करने के लिए HTTP स्थिति कोड का उपयोग करें, क्योंकि अन्य सफलता की स्थिति का उल्लेख कर रहे हैं। आपके पास एक सामान्य विधि है जो 200 का प्रतिक्रिया कोड लौटाएगी जो आप चाहते हैं, कोई अपवाद हैंडलर फिर एक त्रुटि ऑब्जेक्ट और एक अलग कोड (यानी 500) वापस कर सकता है।

1

हाँ, आप void वापसी प्रकार के साथ @ResponseBody उपयोग कर सकते हैं:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) 
@ResponseBody 
public void updateDataThatDoesntRequireClientToBeNotified(...) { 
    ... 
} 
+0

तो वापसी का प्रकार क्या होगा .. क्या यह HTTP स्थिति कोड है? – spandey15

7

आप लौट सकते हैं "ResponseEntity" वस्तु। प्रतिक्रिया प्रतिक्रिया वस्तु (जिसमें प्रतिक्रिया शरीर और HTTP स्थिति कोड शामिल है) और प्रतिक्रिया ऑब्जेक्ट से जानकारी प्राप्त करने के समय "ResponseEntity" ऑब्जेक्ट का उपयोग करना बहुत सुविधाजनक है।

GetHeaders(), getBody(), getContentType(), getStatusCode() आदि जैसे तरीके ResponseEntity ऑब्जेक्ट को पढ़ने में आसान बनाता है।

आपको 204 (कोई सामग्री) के http स्टेटस कोड के साथ ResponseEntity ऑब्जेक्ट का उपयोग करना चाहिए, जो विशेष रूप से यह निर्दिष्ट करने के लिए है कि अनुरोध ठीक से संसाधित हो गया है और प्रतिक्रिया निकाय जानबूझकर खाली है। सही जानकारी व्यक्त करने के लिए उचित स्थिति कोड का उपयोग करना बहुत महत्वपूर्ण है, खासकर यदि आप एक एपीआई बना रहे हैं जो एकाधिक क्लाइंट अनुप्रयोगों द्वारा उपयोग किया जा रहा है।

+0

सेटिंग '@ResponseStatus (HttpStatus.NO_CONTENT)' हल किया गया 'एक्सएमएल पार्सिंग त्रुटि: ब्राउज़र में मेरे लिए कोई रूट तत्व नहीं मिला' – aliopi

0

यहाँ उदाहरण कोड मैं एक अतुल्यकालिक विधि

@RequestMapping(value = "/import", method = RequestMethod.POST) 
@ResponseStatus(value = HttpStatus.OK) 
public void importDataFromFile(@RequestParam("file") MultipartFile file) 
{ 
    accountingSystemHandler.importData(file, assignChargeCodes); 
} 

के लिए क्या किया है आप अपने विधि से किसी भी बात पर लौटने के लिए की जरूरत नहीं है सब यह व्याख्या का उपयोग करने के लिए इतना है कि अपने विधि हर मामले में ठीक लौटना चाहिए की जरूरत है

@ResponseStatus(value = HttpStatus.OK) 
संबंधित मुद्दे