क्या यह उम्मीद है कि कोई स्प्रिंग एमवीसी के व्यवहार की उम्मीद करेगा?
स्प्रिंग 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
, फेंके गए अपवाद के सबसे विशिष्ट सुपरक्लास को संभालने वाले को चुना जाता है।