最新消息:欢迎各位技术大牛一起交流讨论,邮箱:gww0426@163.com

通过自定义HandlerExceptionResolver处理异常

Java技术 郭伟伟 8889浏览 0评论
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。如下图:
<bean class="com.snsxiu.job.handler.ExceptionHandler"></bean>
而要实现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学习

转载请注明:郭伟伟@互联网 » 通过自定义HandlerExceptionResolver处理异常


发表我的评论
取消评论

使用新浪微博登陆

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址