2010-11-19 14 views
15

मैं यह नहीं समझ सकता कि @ExceptionHandler द्वारा एक से अधिक प्रकार के अपवाद को कैसे संभाला जाए।वसंत @ExceptionHandler कई प्रकार के अपवादों को संभालने

मुझे इन अपवादों के साथ प्रोग्रामेटिक रूप से निपटने की ज़रूरत है, इसके लिए मुझे एक साझा संदर्भ की आवश्यकता होगी। क्या यह इस संदर्भ के माध्यम से किया गया है "अपवाद पूर्व"? मुझे ऐसा नहीं लगता है, क्योंकि अपवाद इस तरह पकड़ा नहीं गया है, तो मैं इसे कैसे करूँगा?

मैं सभी अपवाद संदर्भों को हैंडलर विधि के तर्क के रूप में नहीं डाल सकता, यह समझ में नहीं आता है, इसे प्रोग्रामेटिक रूप से निपटाया नहीं जा सकता है। क्या हुआ अगर मैं org.springframework.web.multipart को संभालने के लिए चाहता था: इतना है कि मैं "instanceof" इस पर इस्तेमाल कर सकते हैं या सिर्फ एक सामान्य "अपवाद"

@ExceptionHandler({DescriptionCstOrderException.class, SpecializationCstOrderException.class, NoUploadFileException.class, 
        DeadLineCstOrderException.class, DocumentCstOrderException.class, CommentCstOrderException.class}) 
public String handleFormException(Exception ex, ActionRequest actionRequest) { 
    logger.error(ex.getMessage()); 
    SessionErrors.add(actionRequest, ex.getClass().getName()); 
    return "mainOrderForm"; 
    } 

अतिरिक्त प्रश्न के रूप में कहीं और इसे भेजने मैं एक साझा संदर्भ की आवश्यकता .MaxUploadSizeExceededException, जिसे हैंडलर की किसी भी विधि से नहीं फेंक दिया गया है? क्योंकि @ExceptionHandler केवल अपवादों को पकड़ता है जिन्हें हैंडलर विधियों में से एक से फेंक दिया जाता है।

अपवाद हैंडलर विधि को कुछ विस्तारित पैरेंट नियंत्रक में रखा जा सकता है लेकिन यदि कोई केवल डिफ़ॉल्ट एंटरोटेशन हैंडलर मैपिंग का उपयोग करता है ...?

किसी भी मदद की सराहना, मैं पागल जा रहा हूँ, यह बहुत निराशा होती है ....

उत्तर

15

@ExceptionHandler मूल्य अपवाद प्रकार की एक सरणी के लिए सेट किया जा सकता है। यदि कोई अपवाद फेंक दिया गया है, तो सूची में से किसी एक प्रकार से मेल खाता है, तो मिलान @ExceptionHandler के साथ एनोटेटेड विधि लागू की जाएगी। यदि एनोटेशन मान सेट नहीं किया गया है तो विधि तर्क के रूप में सूचीबद्ध अपवाद प्रकार का उपयोग किया जाता है। विवरण के लिए documentation देखें।

0

आपका प्रश्न नहीं बल्कि भ्रामक है, लेकिन अपने अपवाद संचालक विधि एक बार में केवल एक अपवाद को संभाल लेंगे। यह कई अपवाद नहीं पकड़ेगा और फिर दोनों को अपने हैंडल FormException() विधि में पास करेगा। यदि आपको इन अपवाद प्रकारों को अलग-अलग संभालने की आवश्यकता है तो आपको प्रत्येक के लिए एक अपवाद हैंडलर विधि बनाना चाहिए, उस विधि के विशिष्ट अपवाद प्रकार का तर्क निर्दिष्ट करें, और उसके बाद उपयुक्त हैंडलिंग करें। उदाहरण के लिए:

@ExceptionHandler(DescriptionCstOrderException.class) 
public String handleDescriptionCstOrderException(DescriptionCstOrderException exception, ActionRequest actionRequest) {...} 


@ExceptionHandler(SpecializationCstOrderException.class) 
public String handleSpecializationCstOrderException(SpecializationCstOrderException exception, ActionRequest actionRequest) {...} 

// and so on... 

अधिक जानकारी के लिए स्प्रिंग प्रलेखन का संदर्भ लें:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-exceptionhandler

+0

मैं उन्हें उसी तरह संभाल करना चाहते हैं स्प्रिंग documentation में उल्लिखित अपवाद सरणी का उपयोग कर के कार्यान्वयन किया जाएगा। मैं उन्हें सत्र में डालता हूं और दर्शक और जावास्क्रिप्ट उन्हें अलग-अलग संभालता है। जो मैं जानना चाहता था, क्या मेरा नमूना सही है, क्योंकि हैंडलफॉर्म अपवाद विधि एनोटेशन मूल्य सूची में उल्लिखित प्रकारों में से किसी एक के अपवाद को नहीं पकड़ती है ... – lisak

+0

यदि मैं एक अपवाद प्रकार के लिए एक विधि घोषित करता हूं, तो यह काम करता है ... यह अजीब है ... बीटीडब्ल्यू, क्या आप जानते हैं कि हैंडलर के बाहर फेंकने वाले अपवादों को कैसे संभाला जाए? मेरा मतलब है कि @ExceptionHandlers का उपयोग ... जैसा कि मैंने अतिरिक्त प्रश्न पूछा ... – lisak

17

मैं सिर्फ निम चिम्पस्की उत्तर में जोड़ रहा हूं "@ExceptionHandler मान अपवाद प्रकारों की एक सरणी पर सेट किया जा सकता है"।

तरह

@ExceptionHandler({NotFoundException.class,MissingServletRequestParameterException.class})

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