通过自定义HandlerExceptionResolver处理异常

Spring MVC通过HandlerExceptionResolver处理程序的异常

在了解HandlerExceptionResolver之前,我们先了解一下Resolver。Resolver直译为“解析器”,那么在spring MVC中是有很多“解析器”的,比如ViewResolver、MultipartResolver、ThemeResovler、LocalResover。不过别误会,这些“Resolver”之间几乎没任何关系,唯一的关系是名字中最后都是Resolver,然后都在同一个包下(org.springframework.web.servlet)

我们知道Spring MVC的核心是DispatcherServlet,那么其实上面列出的这些Resovler都是在DispatcherServlet中来加载的。

DispatcherServlet默认是通过在ApplicationContext中根据类型来装载HandlerExceptionResolver的,如下图。当然也可以在web.xml中配置DispatcherServlet时指定detectAllHandlerExceptionResolvers=false后通过beanName来加载HandlerExceptionResolver。

Image

通过上面的分析我们就知道,默认情况下在Spring MVC的dispatchServlet.xml配置文件中配置实现了HandlerExceptionResolver接口的bean就可以了,甚至不用指定beanName。如下图:

而要实现HandlerExceptionResolver接口,也是非常简单,只需要实现其中的resolveException方法即可。在这个方法里,你可以取到抛出异常时的HttpServletRequest对象、HttpServletResponse对象、当前正在执行的Handler、以及抛出的异常Exception。

下面是一个很简单的例子,仅在异常发生时记录了日志,然后将response的状态置为500,最后跳转到错误页面。

public class ExceptionHandler implements HandlerExceptionResolver {

    private static final Log logger = LogFactory.getLog(ExceptionHandler.class);

    @Override

    public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse response,

            Object arg2, Exception arg3) {

        logger.error(“error uri:” + arg0.getRequestURI() + “,params:” + getFromString(arg0), arg3);

        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

        return new ModelAndView(“forward:/error/500”);

    }

}

 关于Spring MVC中更多关于DispatchServlet以及HandlerExceptionResolver的知识,可以参考我的另一篇文章《ContextLoaderListener和Spring MVC中的DispatcherServlet学习