क्या खाली रिक्वेस्टपराम वैल्यूज को डिफॉल्ट वेल्यू का इस्तेमाल करना संभव है?


120

अगर मेरे पास निम्नलिखित के समान मैपिंग का अनुरोध है:

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

और फिर इस अनुरोध के साथ कॉल करें:

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

मुझे त्रुटि संदेश मिलता है

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

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

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

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

मुझे यकीन नहीं है कि वसंत के किस संस्करण में यह व्यवहार परिवर्तन किया गया था।


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

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

धन्यवाद amir75, गलती से आपूर्ति Stringप्रकार। user902383, यह सही है, हालांकि एक पूर्णांक मान के लिए मैं पसंद करूंगा कि एक अशक्त / खाली मान बजाए defaultValue का उपयोग करेगा।
ब्रेट रायन

जवाबों:


175

आप @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

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

3
अप्रचलित उत्तर, सबसे अच्छा समाधान @AppLend से है
जोस पोज़ एस

101

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

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

PS वसंत प्रलेखन से यह पृष्ठ उपयोगी हो सकता है: एनोटेशन टाइप रिक्वेस्टपराम


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

5
वैसे भी, जब defaultValueप्रदान किया गया था, required == falseस्पष्ट रूप से
तैमूर मिलोवानोव

4
यदि परम प्रदान किया जाता है, लेकिन खाली defaultValueहै, तो प्रभावी नहीं होता है।
ब्रेट रयान

12

आप रिक्वेस्ट के बजाय जेनेरिक क्लास इंटेगर का इस्तेमाल करके रिक्वेस्टपराम सेट कर सकते हैं, इससे आपकी समस्या दूर हो जाएगी।

   @RequestParam(value= "i", defaultValue = "20") Integer i

1

आप भी कुछ ऐसा कर सकते हैं -

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

3
यदि आपके पास एक DefaultValue है, तो इसे वैकल्पिक बनाने की कोई आवश्यकता नहीं है।
केविन एम

1

इसे 2013 में बग माना गया था: https://jira.spring.io/browse/SPR-10180

और संस्करण 3.2.2 के साथ तय किया गया था। समस्या उसके बाद किसी भी संस्करण में नहीं होनी चाहिए और आपका कोड ठीक काम करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.