Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包含 Handler 映射、数据绑定以及目标方法运行时发生的异常。

SpringMVC 提供的 HandlerExceptionResolver 的实现类

DispatcherServlet 默认装配的 HandlerExceptionResolver :

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

假设加入了<mvc:annotation-driven/> 则装配变为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

1.1. ExceptionHandlerExceptionResolver

ExceptionHandlerExceptionResolver 主要处理 Handler 中用 @ExceptionHandler 注解定义的方法。

l @ExceptionHandler 注解定义的方法优先级问题:比如发生的是NullPointerException,可是声明的异常有RuntimeException 和 Exception,此候会依据异常的近期继承关系找到继承深度最浅的那个 @ExceptionHandler注解方法。即标记了 RuntimeException 的方法

l ExceptionHandlerMethodResolver 内部若找不到 @ExceptionHandler 注解的话,会找 @ControllerAdvice 中的 @ExceptionHandler 注解方法

Java:

package com.ibigsea.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class ExceptionController { /**
* 假设运行此Controller里面的方法出现<b>数学异常</b>,则会运行该方法
* @param e
* @return
*/
@ExceptionHandler({ArithmeticException.class})
public String arithmeticException(Exception e){
System.out.println("arithmeticException:"+e);
return "error";
} /**
* 假设运行此Controller里面的方法出现异常,则会运行该方法
* @param e
* @return
*/
@ExceptionHandler({Exception.class})
public String exceptionHandle(Exception e){
System.out.println("Exception"+e);
return "error";
} @RequestMapping("/exception")
public String exception(Integer i){
System.out.println(10/i);
return "success";
} }

上述异常处理代码会优先运行arithmeticException方法.

或者在类上面加入@ControllerAdvice注解

package com.ibigsea.springmvc.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvice
public class TestExceptionHandler { @ExceptionHandler({ArithmeticException.class})
public String handleException(Exception e) {
System.out.println("----> 出异常了: " + e);
return "error";
} }

注意:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

由于在运行@ExceptionHandler修饰的方法时没有传入BindingAwareModelMap对象,所以不能在方法上面加入额外的形參

1.2. ResponseStatusExceptionResolver

l 在异常及异常父类中找到 @ResponseStatus 注解,然后使用这个注解的属性进行处理。

l 定义一个 @ResponseStatus 注解修饰的异常类

l 若在处理器方法中抛出了上述异常:若ExceptionHandlerExceptionResolver 不解析该异常。因为触发的异常 UnauthorizedException 带有@ResponseStatus注解。

因此会被ResponseStatusExceptionResolver 解析到。

最后响应HttpStatus.UNAUTHORIZED 代码给client。HttpStatus.UNAUTHORIZED 代表响应码401。无权限。

关于其它的响应码请參考 HttpStatus 枚举类型源代码。

Java:

	@RequestMapping("/responseStatus")
public String responseStatus(Integer i){ if (i>20) {
throw new TestResponseStatusException();
} return "success";
}
package com.ibigsea.springmvc.exceptionresolver;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(value=HttpStatus.FORBIDDEN, reason="測试@ResponseStatus!")
public class TestResponseStatusException extends RuntimeException { private static final long serialVersionUID = 4566548902417978204L; }

结果:



1.3. DefaultHandlerExceptionResolver

对一些特殊的异常进行处理。比方NoSuchRequestHandlingMethodException、HttpRequestMethodNotSupportedException、HttpMediaTypeNotSupportedException、HttpMediaTypeNotAcceptableException等。

	@RequestMapping(value="/defaultHandler",method=RequestMethod.POST)
public String defaultHandlerException(){
return "success";
}

1.4. SimpleMappingExceptionResolver

假设希望对全部异常进行统一处理,能够使用SimpleMappingExceptionResolver,它将异常类名映射为视图名,即发生异常时使用相应的视图报告异常

JAVA

	@RequestMapping("/simpleMapping")
public String simpleMappingException(Integer i){
String[] strs = new String[10];
System.out.println(strs[i]);
return "success";
}

Spring-mvc.xml

	<!-- 配置使用SimpleMappingExceptionResolver来映射异常 -->
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionAttribute" value="ex"></property>
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop>
</props>
</property>
</bean>

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver的更多相关文章

  1. springmvc学习笔记--REST API的异常处理

    前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...

  2. 史上最全的SpringMVC学习笔记

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  3. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  4. springmvc学习笔记(简介及使用)

    springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...

  5. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  6. springmvc学习笔记---面向移动端支持REST API

    前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...

  7. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  8. SpringMVC:学习笔记(8)——文件上传

    SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...

  9. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

随机推荐

  1. The incident LOST_EVENTS occured on the master. Message: error writing to the binary log, Error_code

    1 mysq error日志报错例如以下: 2014-05-12 11:29:54 22977 [ERROR] Slave SQL: The incident LOST_EVENTS occured ...

  2. 【推荐】适合本科生的网络公开课(MOOC为主),不断更新……

    题记:身在海大(湛江),是幸运还是不幸,每一个人有自己的定义.人生不能再来一次,唯有把握当下.提高自己,才可能在不能拼爹的年代靠自身实力前行.或许,我们做不了富二代.但我们每一个人.都有机会成为富二代 ...

  3. 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理具体解释

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说.主要通过MFC单文档视图实现显示BMP图片点运算处理.包含图像灰度线性变换 ...

  4. vim-插入格式化时间

    最近一直在搞vimrc的配置.其中有一点就是,我想要实现代码快速注释的功能.而这个功能中的一个关键点就是,我要获得系统当前的时间,然后插入到我的注释里面.我知道vimrc支持shell命令,既使用:r ...

  5. window cmd 命令大全 (order)

    Windows CMD命令大全 命令简介 cmd是command的缩写.即命令行 . 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统 ...

  6. docker 部署 jenkins server

    1. 拉取一个jenkins 镜像 docker pull jenkins 2. 创建与jenkins配置目录对应的,容器外的,文件目录,并修改相应的权限 mkdir /home/jenkins ch ...

  7. CSDN的个人主页如何添加微信二维码

    -–零-– 对于CSDN,这里是技术的交流的地方,有些大神,隐于此.各有各的技能,各有各的魅力. 在这里,如果有自己的能力,你想推广你个人.我想,你将你的微信二维码或者你的微信公众号的二维码放在这里, ...

  8. QQ亿级日活跃业务后台核心技术揭秘

    http://ms.csdn.net/geek/75478 引言 作为本次技术开放日后台架构专场的出品人我今天给大家带来<构造高可靠海量用户服务-SNG数亿级日活跃业务后台核心技术揭秘>, ...

  9. PHP 版本简单记录

    PHP 版本简单记录 PHP 博物馆         http://museum.php.net/php5/ PHP 版本发布       https://secure.php.net/release ...

  10. Android学习笔记进阶十二之裁截图片

    package xiaosi.cut; import java.io.File; import android.app.Activity; import android.content.Intent; ...