2010-08-11 16 views
6

मुझे इस तरह के एक साधारण सवाल पूछने के लिए क्षमा करें क्योंकि मैं स्प्रिंग एमवीसी 3.0 के लिए नया हूं। मैं वसंत स्रोत वेबसाइट से कुछ बार दस्तावेज पढ़ रहा हूं।स्प्रिंग एमवीसी 3.0: क्या @PathVariable के लिए पसंदीदा प्रकार स्ट्रिंग का उपयोग किया जा रहा है?

@RequestMapping("/pets/{petId}") 
public void findPet(@PathVariable String petId, Model model) {  
// implementation omitted 
} 

मैं इस उदाहरण के आधार पर यूआरआई टेम्पलेट का उपयोग करना चाहते हैं, यह हमेशा स्ट्रिंग होने की @PathVariable प्रकार स्थापित करने के लिए बेहतर है -: कोड स्निपेट है कि मैं नीचे मेरे सवाल के लिए का उल्लेख करेंगे भले ही मैं इसे अन्य प्रकार की उम्मीद कर रहा हूं, जैसे कि एक int? प्रलेखन का कहना है कि @PathVariable एनोटेशन किसी भी साधारण प्रकार का हो सकता है, लेकिन यदि वसंत अमान्य petId को int में परिवर्तित करने में असमर्थ है (उदाहरण के लिए, उपयोगकर्ता संख्याओं के बजाय कुछ वर्णों में प्रवेश करता है), तो यह एक टाइपमिस्मैच अपवाद फेंक देगा।

तो, वैधता कब खेलती है? क्या मैं सभी @PathVariable प्रकारों को स्ट्रिंग होने के लिए छोड़ता हूं और स्ट्रिंग मानों पर सत्यापन करने के लिए सत्यापनकर्ता है, और यदि कोई सत्यापन त्रुटि नहीं है, तो स्ट्रिंग को वांछित प्रकार में स्पष्ट रूप से रूपांतरित करें?

धन्यवाद।

उत्तर

6
  1. @PathVariable प्रकार आप उम्मीद करते हैं, जरूरी नहीं कि String
  2. हो एक अच्छी तरह से अनुकूलित त्रुटि पृष्ठ है। यदि उपयोगकर्ता यूआरएल में कुछ लिखने का फैसला करता है, तो उसे "परिणामों" से अवगत होना चाहिए।
+0

यह दृष्टिकोण काम करता है देखें उपयोगकर्ता यूआरएल खुद को निर्माण करती है। हालांकि, मुझे यकीन नहीं है कि यह कैसे काम करेगा यदि पेटीड के लिए मूल्य किसी फॉर्म से सबमिट किए गए खुले टेक्स्ट फ़ील्ड से आता है। – limc

+1

तो यह '@ PathVariable' नहीं है, बल्कि' @ RequestParam' है। और प्रमाणीकरण क्लाइंट-साइड किया जाना चाहिए, सर्वर-साइड – Bozho

+0

के अतिरिक्त आपके अंतर्दृष्टिपूर्ण स्पष्टीकरण के लिए धन्यवाद, मुझे लगता है कि मैं @ पाथवार्येबल और @requestparam के बीच उलझन में आया हूं। – limc

7

आप

लेकिन अगर स्प्रिंग किसी पूर्णांक में अवैध petId परिवर्तित करने में असमर्थ है, यह एक TypeMismatchException फेंक जाएगा ने कहा।

ठीक है। लेकिन तुम उठाया @ExceptionHandler टिप्पणी द्वारा नियंत्रक में अपवाद को संभाल सकता है अगर आप चाहते हैं

@ExceptionHandler(TypeMismatchException.class) 
public String handleIOException(TypeMismatchException e, HttpServletRequest request) { 
    // handle your Exception right here 
} 

@ExceptionHandler हैंडलर विधि हस्ताक्षर flexibe है, here

+0

और मेरा अपवॉट @ExceptionHandler के बारे में जाता है, जिसे मैं नहीं जानता था;) – Bozho

+0

इसे स्ट्रिंग के रूप में रखने और अपवाद को पकड़ने के लिए सभी TypeMismatchException.class को पकड़ने पर अधिक नियंत्रण होता है यदि मैं अलग-अलग कॉल संदेशों को अलग करता हूं तो मुझे अलग-अलग त्रुटि संदेश चाहिए तरीकों? –

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