SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver
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的更多相关文章
- springmvc学习笔记--REST API的异常处理
前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- springmvc学习笔记(简介及使用)
springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- springmvc学习笔记---面向移动端支持REST API
前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...
- WCF 学习笔记之异常处理
WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- springmvc学习笔记(常用注解)
springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...
随机推荐
- 思科2960trunk vlan配置及路由IP配置
en conf t vlan id end conf t inter rang gi 0/0/1-x switchport access vlan id no shutdown exit (confi ...
- Android ijkplayer在windows下编译并导入Android Studio
我是看着里面的步骤来做的,由于我自己对Linux环境和命令不熟悉,导致我对Cygwin的知识为零,在编译ijkplayer的时候走了一点弯路,需要的同学先去看一下上面的这篇文章,我这边是对上面文章做 ...
- tomcat:web容器
Web容器和应用服务器除了你所说的request response之外还有很多其他重要的功能. 1. 多线程和并发处理,估计你写的socket程序支持不了几个并发访问吧 2. 安全性 3. 生命周期管 ...
- PHP防止Xss攻击
mysql_real_escape_string() 所以得SQL语句如果有类似这样的写法:"select * from cdr where src =".$userId; 都要改 ...
- [Python's] Python's list comprehensions a
# Python's list comprehensions are awesome. vals = [expression for value in collection if condition] ...
- 【UWP通用应用开发】控件、应用栏
控件的属性.事件与样式资源 怎样加入控件 加入控件的方式有多种,大家更喜欢以下哪一种呢? 1)使用诸如Blend for Visual Studio或Microsoft Visual Studio X ...
- hdu 1533 Going Home 最小费用最大流 入门题
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- SSH密码错误几次后封禁登录IP
#!/bin/bash yum -y install vixie-cron crontabs mkdir -p /usr/local/cron/ cat > /usr/local/cron/ss ...
- Ajax跨域:Jsonp实例--百度搜索框下拉提示
Ajax跨域:Jsonp实例--百度搜索框下拉提示 一.总结 一句话总结:a.找好接口:b.用script标签的src引入文件(json数据):c.定义及实现上一步引入文件中的函数 1.如何找到一个网 ...
- linux设置tab键的宽度为4
先cd 到~目录 ~$ cd ~$ vi .vimrc set nu