Spring MVC-HandlerExceptionResolver
2015-06-30 14:59
661 查看
顾名思义,这个接口类HandlerExceptionResolver是处理异常的解析器。就是adapter在对请求进行处理的时候。看一下继承关系:
因为Spring默认加载的是三个类DefaultHandlerExceptionResolver、ResponseStatusExceptionResolver和AnnotationMethodHandlerExceptionResolver,所以这里主要介绍这三个类。
接口HandlerExceptionResolver中定义的方法是
DefaultHandlerExceptionResolver
作用:判断所有能常见的异常类,然后在设置response.sendError()和response.setHeader(), 返回new ModelAndView()。
ResponseStatusExceptionResolver
作用:根据ResponseStatus注解得到相应的配置信息,从而设置response.sendError。关键代码如下:
AnnotationMethodHandlerExceptionResolver
作用:注解式声明异常处理器-ExceptionHandler,就是配合这个注解得到需要的类型类。
因为Spring默认加载的是三个类DefaultHandlerExceptionResolver、ResponseStatusExceptionResolver和AnnotationMethodHandlerExceptionResolver,所以这里主要介绍这三个类。
接口HandlerExceptionResolver中定义的方法是
ModelAndView resolveException( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);所有的子类都要服务和实现这个方法。
DefaultHandlerExceptionResolver
作用:判断所有能常见的异常类,然后在设置response.sendError()和response.setHeader(), 返回new ModelAndView()。
response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE); List<MediaType> mediaTypes = ex.getSupportedMediaTypes(); if (!CollectionUtils.isEmpty(mediaTypes)) { response.setHeader("Accept", MediaType.toString(mediaTypes)); } return new ModelAndView();
ResponseStatusExceptionResolver
作用:根据ResponseStatus注解得到相应的配置信息,从而设置response.sendError。关键代码如下:
ResponseStatus responseStatus = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class); ……………………………… int statusCode = responseStatus.value().value();//返回码 String reason = responseStatus.reason();//原因 if (!StringUtils.hasLength(reason)) { response.sendError(statusCode); } else response.sendError(statusCode, reason);
AnnotationMethodHandlerExceptionResolver
作用:注解式声明异常处理器-ExceptionHandler,就是配合这个注解得到需要的类型类。
if (handler != null) { //得到最优的异常处理方法 Method handlerMethod = findBestExceptionHandlerMethod(handler, ex); if (handlerMethod != null) { ServletWebRequest webRequest = new ServletWebRequest(request, response); try { Object[] args = resolveHandlerArguments(handlerMethod, handler, webRequest, ex); if (logger.isDebugEnabled()) { logger.debug("Invoking request handler method: " + handlerMethod); } //反射的机制调用 Object retVal = doInvokeMethod(handlerMethod, handler, args); //根据通过反射机制调用的方法得到返回值,然后判断返回值返回正确的ModelAndView对象 return getModelAndView(handlerMethod, retVal, webRequest); }
相关文章推荐
- double,int与String之间转换
- spring mvc message-convert
- jdk版本
- struts2 文件下载(修正中文问题)
- 使用Eclipse构建Maven项目 (step-by-step)
- java中FileOutputStream流,向文件中追加内容,而不是覆盖掉文件中原有的数据
- Web项目报错java.lang.ClassCastException
- java中substring和indexof() 和lastindexof()
- 通过java调用servlet接口----json
- Spring AOP深入理解之拦截器调用
- Spring4 SpringMVC Hibernate4 Freemaker 集成示例
- java回车登陆
- java迭代器(Iterator)简单使用
- java中String的常用方法
- Java EE应用的组件
- struts2.1笔记07:Sturts.xml配置中的包介绍
- java验证码识别带源码以及讲解视频
- Eclipse中<uses-permission>和<permission>和<uses-feature>区别
- eclipse failed to create the java virtual machine 问题
- java Volatile关键字解析