2010-07-12 11 views
28

स्प्रिंग 3 उपयोग करने के लिए ExceptionHandler बनाएं, मैं ExceptionHandler एनोटेशन "कोई पेज (404) मिला" अनुरोधों को हैंडल का उपयोग कर अपवाद संचालक बनाने के लिए पसंद करते हैं। मैं ऐसा करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूँ। लेकिन जब मैं एक ऐसे यूआरएल को इंगित करता हूं जो अस्तित्व में नहीं है, तो स्प्रिंग द्वारा परिभाषित डिफ़ॉल्ट अपवाद हैंडलर को बुलाया जा रहा है।स्प्रिंग 3 - NoSuchRequestHandlingMethodException

ऐसा हो सकता है कि मैं NoSuchRequestHandlingMethodException अपवाद को संभालने वाला हूं। यदि ऐसा है, तो मुझे पंजीकरण करने के लिए क्या अपवाद होना चाहिए?

क्या आप कृपया निम्नलिखित कोड देखें और देखें कि मैं क्या गलत कर रहा हूं?

नोट: अगर मैं @ExceptionHandlerको NullPointerException में अपवाद बदल सकते हैं और नल पॉइंटर फेंकने के लिए एक RequestMapping बनाते हैं तो वह काम करेंगे।

import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.ExceptionHandler; 
    import org.springframework.web.bind.annotation.RequestMapping; 

    import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException; 

    import org.apache.commons.logging.Log; 
    import org.apache.commons.logging.LogFactory; 
    import org.springframework.web.servlet.ModelAndView; 

    @Controller 
    public class GeneralHandler { 
     private final Log logger = LogFactory.getLog(getClass()); 

     @ExceptionHandler(NoSuchRequestHandlingMethodException.class) 
     public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) { 
     ModelAndView mav = new ModelAndView(); 
     logger.error("Exception found: " + ex); 
     return mav; 
     } 
    } 

उत्तर

41

@ExceptionHandler -annotated तरीकों लागू कर रहे हैं जब कि एक ही कक्षा पर एक @RequestMapping विधि एक अपवाद फेंकता है। इसलिए जब आपने मैपिंग को NullPointerException फेंक दिया, तो यह काम करता था, क्योंकि मैप किए गए विधि और अपवाद हैंडलर एक ही कक्षा में एक साथ थे।

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

यदि आप विशेष रूप से इस अपवाद को संभालना चाहते हैं, तो आपको अधिक विशिष्ट @ExceptionHandler तकनीक की बजाय अधिक सामान्य HandlerExceptionResolver approach का उपयोग करना होगा।

+2

धन्यवाद वापस जाने के लिए और अधिक टिप्पणियां जोड़ सकते हैं। मैं हैंडलरएक्सप्शन रीसोलवर दृष्टिकोण का उपयोग करूंगा। – sgsweb

+0

क्या यह आपके लिए काम करता है? मुझे अभी भी एक ही समस्या है – SJS

2

आप this दृष्टिकोण के साथ जा सकते हैं, यह एक अच्छा विचार और काम है, केवल विशेष हैंडलर के साथ अपवाद फेंकने की आवश्यकता @ExceptionHandler ऐसा लगता है जितना उपयोगी नहीं है।

16

स्प्रिंग 3.2 में आप इस तरह से अपने सभी नियंत्रकों के लिए एक ExceptionHandler के लिए @ContollerAdvice उपयोग कर सकते हैं:

@ControllerAdvice 
public class GeneralHandler { 

    @ExceptionHandler 
    public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) { 
     ModelAndView mav = new ModelAndView(); 
     ... 
     return mav; 
    } 
} 

तुम भी धारावाहिक json

@ExceptionHandler 
    @ResponseBody 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public RestError resolveBindingException (MethodArgumentNotValidException methodArgumentNotValidException, Locale locale) 
    { 
     BindingResult bindingResult = methodArgumentNotValidException.getBindingResult(); 
     return getRestError(bindingResult, locale); 
    } 
+0

यह बहुत कुछ है जो मैंने किया है, लेकिन जब से मैं एक ContentNegotiatingViewResolver का उपयोग कर रहा था, तो मैंने 'अपवाद' को पकड़ लिया, फिर जेएसओएन और एक्सएमएल सीरियलाइजेशन एनोटेशन के साथ कक्षा में लपेटकर और उसे वापस कर दिया ModelAndView के बजाय, क्लाइंट रैपर ऑब्जेक्ट का क्रमबद्ध संस्करण प्राप्त करने के समाप्त होता है। –

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