क्या यह उम्मीद है कि कोई स्प्रिंग एमवीसी के व्यवहार की उम्मीद करेगा?
स्प्रिंग 4.3.7 के अनुसार, यहां स्प्रिंग एमवीसी कैसे व्यवहार करता है: यह HandlerExceptionResolverहैंडलर विधियों द्वारा फेंके गए अपवादों को संभालने के लिए उदाहरणों का उपयोग करता है ।
डिफ़ॉल्ट रूप से, वेब MVC कॉन्फ़िगरेशन एक HandlerExceptionResolverबीन, ए HandlerExceptionResolverComposite, जो पंजीकृत करता है
अन्य की सूची में प्रतिनिधि HandlerExceptionResolvers।
वे अन्य रिसोल्वर हैं
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
उस क्रम में पंजीकृत है। इस प्रश्न के उद्देश्य के लिए हम केवल परवाह करते हैं ExceptionHandlerExceptionResolver।
एक है AbstractHandlerMethodExceptionResolverकि @ExceptionHandlerतरीकों के माध्यम से अपवादों को हल करता है ।
संदर्भ आरंभीकरण में, स्प्रिंग ControllerAdviceBeanप्रत्येक @ControllerAdviceएनोटेट वर्ग के लिए उत्पन्न करेगा जो यह पता लगाता है। ExceptionHandlerExceptionResolverसंदर्भ से इन प्राप्त करेंगे, और उन्हें प्रयोग करने का उपयोग कर सॉर्ट AnnotationAwareOrderComparatorजो
का एक विस्तार है OrderComparatorकि वसंत के समर्थन करता है, Ordered
और साथ ही इंटरफ़ेस @Orderऔर @Priority, एनोटेशन एक आदेश दिया उदाहरण एक स्थिर परिभाषित एनोटेशन मूल्य (यदि हो तो) अधिभावी द्वारा प्रदान की एक आदेश मूल्य के साथ।
इसके बाद ExceptionHandlerMethodResolverइनमें से प्रत्येक ControllerAdviceBeanउदाहरण के लिए पंजीकरण करना होगा (उपलब्ध @ExceptionHandlerतरीकों को अपवादित करने के लिए उपलब्ध तरीकों को मैप करना)। इन्हें अंत में उसी क्रम में जोड़ा जाता है a LinkedHashMap(जो पुनरावृति क्रम को संरक्षित करता है)।
जब कोई अपवाद होता है, तो ExceptionHandlerExceptionResolverवसीयत इन के माध्यम से पुनरावृत्ति करेगी ExceptionHandlerMethodResolverऔर पहले वाले का उपयोग करेगी जो अपवाद को संभाल सकती है।
यहां मुद्दा तो यह है: यदि आप एक है @ControllerAdviceएक साथ @ExceptionHandlerके लिए Exceptionहै कि एक और पहले पंजीकृत हो जाता है @ControllerAdviceएक साथ कक्षा @ExceptionHandlerएक अधिक विशिष्ट अपवाद की तरह के लिए IOException, कि पहले एक कहा जाता हो जाएगा। जैसा कि पहले उल्लेख किया गया है, आप अपने @ControllerAdviceएनोटेट वर्ग को लागू करने Orderedया उसके साथ एनोटेट करके @Orderया @Priorityउसे उचित मूल्य देकर उस पंजीकरण आदेश को नियंत्रित कर सकते हैं ।
@ExceptionHandlerएक के भीतर कई तरीकों के मामले में@ControllerAdvice, फेंके गए अपवाद के सबसे विशिष्ट सुपरक्लास को संभालने वाले को चुना जाता है।