2011-08-29 14 views
5
साथ निपटने

मैं वर्तमान में एक स्प्रिंग MVC परियोजना में अपवाद हैंडलिंग के लिए HandlerExceptionResolver उपयोग करने के लिए कोशिश कर रहा हूँ।वसंत MVC अपवाद HandlerExceptionResolver

मैं resolveException के माध्यम से सामान्य अपवादों को संभालना चाहता हूं और 404 के handleNoSuchRequestHandlingMethod के माध्यम से सामान्य अपवादों को संभालना चाहता हूं।

अनुरोध प्रकार JSON या पाठ पर निर्भर करता है/HTML अपवाद प्रतिक्रिया उचित रूप से किया जाना चाहिये।

resolveException अब काम करता है।

लेकिन handleNoSuchRequestHandlingMethod मुझे सिरदर्द दे रहा है। इसे कभी नहीं कहा जाता है!

दस्तावेज के अनुसार विधि 404 त्रुटियों

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.html

क्या मैं गलत कर रहा हूँ पर बुलाया जाना चाहिए ...

यह वही है मैं अब तक है। DefaultHandlerExceptionResolver साथ

public class JsonExceptionResolver implements HandlerExceptionResolver { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    public ModelAndView resolveException(HttpServletRequest request, 
    if (exception instanceof NoSuchRequestHandlingMethodException) { 
       return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException)    exception, request, response, handler); 
    } 
    ...     
    } 

    public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex, 
     HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler){ 

    logger.info("Handle my exception!!!"); 

    ModelAndView mav = new ModelAndView(); 
    boolean isJSON = request.getHeader("Accept").equals("application/json"); 

    if(isJSON){ 
    ... 

    }else{ 
    .. 
    } 

    return mav; 
    } 

} 

संपादित करें:

public class MyExceptionResolver extends DefaultHandlerExceptionResolver { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    @Override 
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { 
    logger.warn("An Exception has occured in the application", exception); 


    logger.info("exception thrown " + exception.getMessage()); 
    if (exception instanceof NoSuchRequestHandlingMethodException) { 
     return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) exception, request, response, handler); 
    } 

    ... 
    return mav; 
    } 

    public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex, 
     HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler){ 

    logger.info("Handle my exception!!!"); 

    ModelAndView mav = new ModelAndView(); 
    boolean isJSON = request.getHeader("Accept").equals("application/json"); 

    if(isJSON){ 

     ... 
    }else{ 
     ... 
    } 

    return mav; 
    } 
} 

ऊपर कोड अभी भी कोई प्रभाव नहीं है।

कोई अन्य विचार?

उत्तर

3

वसंत से जुएर्गेन Hoeller के अनुसार, यह संभव नहीं HandlerExceptionResolver साथ है क्योंकि यह केवल उदाहरण के लिए उप-मानचित्रण के लिए काम करता है

आपके पास /account/** पर मैप किए गए नियंत्रक हैं और यह उस कार्य से एक विधि तक पहुंचता है जहां कोई मैपिंग /acount/notExists की तरह काम नहीं करनी चाहिए।

मैं इस कार्यक्षमता के लिए एक JIRA सुधार टिकट खुल जाएगा

संपादित करें:

JIRA इस मुद्दे

https://jira.springsource.org/browse/SPR-8837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=72648#comment-72648

2

handleNoSuchRequestHandlingMethod तो बस उस नाम की एक विधि की घोषणा कोई कार्य नहीं करेगा, HandlerExceptionResolver इंटरफ़ेस का हिस्सा नहीं है।

if (ex instanceof NoSuchRequestHandlingMethodException) { 
    return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) ex, request, response, handler); 
} 

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

+0

मैं अपने कोड अद्यतन के बारे में टिकट। क्या आपका मतलब यह था? –

+1

मैंने इसे 'डिफॉल्ट हैंडलर एक्सेप्शन रीसोलवर'' से विरासत के साथ भी करने की कोशिश की, लेकिन 404 के मामले में ''doResolveException'' कभी नहीं बुलाया गया ... क्या मैंने आपको याद किया? –

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