2010-05-20 10 views
8

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

@Controller 
public class ExceptionController { 

    @RequestMapping(value="/error") 
    @ExceptionHandler(value={Exception.class, NullPointerException.class}) 
    public String showError(Exception e, Model model){ 
     return "tiles:error"; 
    } 
} 

और मैं कोशिश करने के लिए करता है, तो यह काम करता है मैं अन्य विधि नियंत्रक में किसी अन्य विधि में एक NullPointerException फेंक:

boolean a = true; 
if(a){ 
    throw new NullPointerException(); 
} 

बाद अपवाद फेंक दिया जाता है यह JSP में छपा है, लेकिन यह नहीं है मेरे शोएरर() विधि को फेंक दें (मैंने वहां एक ब्रेकपॉइंट सेट किया है और यह कभी प्रवेश नहीं करता है)। showError() विधि अपवाद को पकड़ लेगी और अपवाद प्रकार के आधार पर अलग-अलग त्रुटि पृष्ठों को दिखाएगी (हालांकि अब यह हमेशा एक ही त्रुटि पृष्ठ दिखाती है)। अगर मैं यूआरएल/त्रुटि पर जाता हूं तो यह त्रुटि पृष्ठ दिखाता है ताकि showError() विधि ठीक है।

मैं वसंत का उपयोग कर रहा 3.

समस्या क्या हो सकता है?

धन्यवाद।

+2

में किया जा रहा आप नियंत्रकों से अपवाद हैंडलिंग दसगुणा, तो बजाय एक 'HandlerExceptionResolver' उपयोग करना चाहते हैं: http://static.springsource.org/spring/docs/3.0। एक्स/वसंत-ढांचे-संदर्भ/एचटीएमएल/एमवीसीएचटीएमएल # d0e29470 – skaffman

उत्तर

7

आप अपने को देखने की, तो आप शायद यह देखेंगे:

java.lang.IllegalStateException: असमर्थित तर्क [org.springframework.ui.Model] @ExceptionHandler विधि

दूसरे शब्दों में के लिए, @ExceptionHandler तरीके हैं Model पैरामीटर घोषित करने की अनुमति नहीं है (docs देखें)।

उस पैरामीटर को हटाएं (जिसे आप किसी भी तरह से उपयोग नहीं कर रहे हैं), और इसे अपेक्षा के अनुसार काम करना चाहिए।

+0

धन्यवाद यह सच है, लेकिन यह समस्या को हल नहीं करता है। मुझे एहसास हुआ है कि अपवाद केवल तभी पकड़ा जाता है जब इसे एक ही नियंत्रक के अंदर एक विधि द्वारा फेंक दिया जाता है। यह इस बग के कारण हो सकता है: https://jira.springsource.org/browse/SPR-5959 – Javi

+1

@Javi: यह एक बग नहीं है, यह डिज़ाइन द्वारा है, और दस्तावेज़ों में कहा गया है: http: //static.springsource। संगठन/वसंत/दस्तावेज़/3.0.एक्स/वसंत-ढांचे-संदर्भ/एचटीएमएल/एमवीसीएचटीएमएल # एमवीसी-एन-अपवादक – skaffman

+0

मैंने ऊपर से जुड़े दस्तावेज़ पृष्ठ को देखा, लेकिन मुझे घना होना चाहिए, मैं नहीं देख रहा हूं कुछ भी जो कहता है कि आप विधि में मॉडल पैरामीटर शामिल नहीं कर सकते हैं, क्या आप इसे इंगित कर सकते हैं? – chrismarx

0

यदि आप वैश्विक स्तर पर अपवाद (अपने नियंत्रक के बाहर) को संभालना चाहते हैं, तो आप एक @ControllerAdvice एनोटेटेड क्लास का उपयोग कर सकते हैं जिसमें आपने अपना @ExceptionHandler एनोटेटेड विधियां डाल दी हैं।

उदाहरण के लिए http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc देखें। और http://blog.codeleak.pl/2013/11/controlleradvice-improvements-in-spring.html सुधार के लिए वसंत 4.

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

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