一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

java中通过自定义HandlerExceptionResolver处理异常

时间:2016-04-07 编辑:简简单单 来源:一聚教程网

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

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

Image


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”);
    }
}

热门栏目