2010-02-18 17 views
7

मैं बहुत तरह @RequestParam एनोटेशन का उपयोग करना चाहेंगे:स्प्रिंग @MVC और @RequestParam सत्यापन

@RequestMapping 
public void handleRequest(@RequestParam("page") int page) { 
    ... 
} 

हालांकि, मैं पेज 1 दिखाने के लिए उपयोगकर्ता URL पैरामीटर के साथ fiddles और पर जाने के लिए कोशिश करता है तो चाहते हैं पृष्ठ "abz" या कुछ गैर-संख्यात्मक। अभी, सबसे अच्छा मैं वसंत करने के लिए एक 500 वापस कर सकता हूं। क्या इस व्यवहार को स्ट्रिंग के रूप में पैरामीटर में ले जाने के बिना साफ तरीके से ओवरराइड करने का कोई तरीका है?

मैंने @ExceptionHandler एनोटेशन देखा, लेकिन जब मैं सेट करता हूं तो यह कुछ भी नहीं लगता है जब मैं @ExceptionHandler(TypeMismatchException.class) का उपयोग करता हूं। यकीन नहीं क्यों नहीं।

सुझाव?

पीएस बोनस प्रश्न: स्प्रिंग एमवीसी को स्प्रिंग एमवीसी कहा जाता है। स्प्रिंग एमवीसी एनोटेशन के साथ बस स्प्रिंग @ एमवीसी कहा जाता है? Google उन्हें एक ही नाम के रूप में मानता है, जो परेशान है।

+0

क्या आपने चर के लिए डिफ़ॉल्ट मान असाइन करने का प्रयास किया था। @RequestParam के लिए एक सुविधा है। –

उत्तर

8

वसंत 3.0 के बाद से, आप ConversionService सेट कर सकते हैं। @InitBinder के value एक विशेष पैरामीटर निर्दिष्ट करता है कि सेवा लागू करने के लिए:

@InitBinder("page") 
public void initBinder(WebDataBinder binder) { 
    FormattingConversionService s = new FormattingConversionService(); 
    s.addFormatterForFieldType(Integer.class, new Formatter<Integer>() { 
     public String print(Integer value, Locale locale) { 
      return value.toString(); 
     } 

     public Integer parse(String value, Locale locale) 
       throws ParseException { 
      try { 
       return Integer.valueOf(value); 
      } catch (NumberFormatException ex) { 
       return 1; 
      } 
     } 
    }); 
    binder.setConversionService(s); 
} 
+0

जब भी 'binder.setConversionService' को कॉल किया जाता है, अपवाद 'java.lang.IllegalStateException: DataBinder पहले से ही रूपांतरण सेवा के साथ प्रारंभ किया गया है' फेंक दिया गया है। क्या तुम्हारे पास कोई विचार है? –

+1

अच्छा समाधान, लेकिन यह दुख की बात है कि यदि आपके पास "? पृष्ठ =" जैसे अनुरोध है (इसलिए पैरामीटर के रूप में खाली स्ट्रिंग के साथ) 'parse' बिल्कुल नहीं कहा जाता है, तो पृष्ठ पैरामीटर शून्य पर सेट हो जाएगा। – Janning

10

ConversionService एक अच्छा समाधान है, लेकिन यह एक मूल्य का अभाव है अगर आप ?page= की तरह आपके अनुरोध के एक खाली स्ट्रिंग दे ConversionService बस नहीं बुलाया जाता है बिल्कुल, लेकिन page (Integer के मामले में) null पर सेट हो या एक अपवाद फेंक दिया है

यह मेरा पसंदीदा समाधान है (एक int के मामले में):

@RequestMapping 
public void handleRequest(HttpServletRequest request) { 
    int page = ServletRequestUtils.getIntParameter(request, "page", 1); 
} 

इस तरह आपके पास हमेशा एक वैध int पैरामीटर होता है।

+0

बहुत अच्छा। धन्यवाद। –

संबंधित मुद्दे