2012-09-06 8 views
65

अगर मैं आ अनुरोध मानचित्रण निम्न के समान है:क्या खाली हो सकता है RequestParam मान डिफ़ॉल्ट वैल्यू का उपयोग करते हैं?

http://example.com/test?i= 

मैं त्रुटि संदेश

का मूल्य परिवर्तित करने में विफल मिलती है:

@RequestMapping(value = "/test", method = RequestMethod.POST) 
@ResponseBody 
public void test(@RequestParam(value = "i", defaultValue = "10") int i) { 
} 

और फिर इस अनुरोध के साथ फोन 'int' टाइप करने के लिए 'java.lang.String' टाइप करें; इनपुट स्ट्रिंग के लिए:: नेस्टेड अपवाद java.lang.NumberFormatException है "" '

मैं, या स्ट्रिंग मूल्यों को स्वीकार करने और केवल पार्स करने से या तो खाली मापदंडों भेजने से जावास्क्रिप्ट ग्राहक को रोक कर इस हल कर सकते हैं अगर वे नहीं पाए जाते हैं खाली होना

अद्यतन: वसंत के बाद के संस्करण अब मूल रूप से वांछित व्यवहार को लागू करते हैं।

मैंने वसंत 4.3.5 में इसका परीक्षण किया है और पाया है कि व्यवहार वास्तव में NumberFormatException को उठाए बिना डिफ़ॉल्ट मान को शून्य मान को बदल देगा; मेरा मूल मैपिंग अब ठीक काम करता है।

मुझे यकीन नहीं है कि वसंत का कौन सा संस्करण इस व्यवहार में बदलाव किया गया था।

+0

निश्चित रूप से पैरामीटर उस अपवाद को बढ़ाने के लिए एक इंटीजर प्रकार होगा? – laher

+3

मैं वसंत विशेषज्ञ नहीं हूं, लेकिन जब आप इसे सेट नहीं करते हैं तो डिफ़ॉल्ट मान का उपयोग किया जाता है? यानी यदि आपका अनुरोध http://example.com/test होगा? जैसा कि आप http://example.com/test?i= का उपयोग करते हैं, तो मैं मौजूद हूं और "" पर सेट किया गया है, इसलिए डिफ़ॉल्ट मान का उपयोग नहीं किया जाता है – user902383

+0

धन्यवाद amir75, गलती से 'स्ट्रिंग' प्रकार की आपूर्ति की गई। user902383, यह सही है, हालांकि एक पूर्णांक मान के लिए मैं पसंद करूंगा कि एक शून्य/खाली मान इसके बजाय डिफ़ॉल्ट वैल्यू का उपयोग करेगा। –

उत्तर

101

आप @RequestParam प्रकार को एक इंटीजर में बदल सकते हैं और इसे आवश्यक नहीं बना सकते हैं। यह आपके अनुरोध को सफल होने की अनुमति देगा, लेकिन फिर यह शून्य होगा। आप स्पष्ट रूप से नियंत्रक विधि में अपने डिफ़ॉल्ट मान के लिए सेट कर सकते हैं:

@RequestMapping(value = "/test", method = RequestMethod.POST) 
@ResponseBody 
public void test(@RequestParam(value = "i", required=false) Integer i) { 
    if(i == null) { 
     i = 10; 
    } 
    // ... 
} 

मैं ऊपर के उदाहरण से DefaultValue को हटा दिया है, लेकिन आप इसे शामिल करने के लिए यदि आप अनुरोध जहां यह सेट नहीं है प्राप्त करने की अपेक्षा कर सकते हैं सब पर:

http://example.com/test 
+3

बस इस पर एक अपडेट, वसंत के हाल के संस्करणों को वास्तव में शून्य जांच की आवश्यकता नहीं है क्योंकि वांछित व्यवहार वसंत के साथ शामिल किया गया है कि खाली मूल्यों का परिणाम डिफ़ॉल्ट मान का उपयोग किया जाएगा। –

+1

अप्रचलित उत्तर, सबसे अच्छा समाधान @AppLend –

57

आप डिफ़ॉल्ट मान सेट सिर्फ जोड़ने आपके मामले में, द्वारा आदिम प्रकार रख सकते "आवश्यक = false" संपत्ति:

@RequestParam(value = "i", required = false, defaultValue = "10") int i 

पीएस स्प्रिंग दस्तावेज़ से यह पृष्ठ उपयोगी हो सकता है: Annotation Type RequestParam

+0

से है धन्यवाद, लेकिन आप शीर्षक में मेरे प्रश्न के बिंदु को याद करते हैं। मैंने खाली पैरा '/ test? I = 'की आपूर्ति करने की क्षमता मांगी है और चूंकि' i' खाली है तो डिफ़ॉल्ट मान है। –

+1

वैसे भी, जब '' 'डिफ़ॉल्ट वैल्यू'' प्रदान किया गया था,' '' आवश्यक == झूठी'' 'निहित –

+3

यदि परम प्रदान किया गया है लेकिन खाली है' डिफ़ॉल्ट वैल्यू 'प्रभावी नहीं होता है। –

0

तुम भी कुछ इस तरह कर सकते हैं -

@RequestParam(value= "i", defaultValue = "20") Optional<Integer> i 
0

आप पूर्णांक के बजाय सामान्य वर्ग पूर्णांक का उपयोग कर RequestParam सेट कर सकते हैं, यह आपकी समस्या का समाधान होगा।

@RequestParam(value= "i", defaultValue = "20") Integer i 
संबंधित मुद्दे