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. 小白学开发(iOS)OC_ SEL数据类型(2015-08-10)

    // //  main.m //  SEL数据类型 // //  Created by admin on 15/8/12. //  Copyright (c) 2015年 admin. All rig ...

  2. 怎样通过MSG_WAITALL设置阻塞时间,IO模式精细讲解: MSG_DONTWAIT 、 MSG_WAITALL

    首先给出MSDN上一段设置阻塞超时的代码:(网址为http://social.msdn.microsoft.com/Forums/zh-SG/visualcpluszhchs/thread/3d9da ...

  3. 企业实战之部署Solarwinds Network八部众

    企业实战之部署Solarwinds Network 网管系统八部众 Orion Network Performance Monitor是全面的带宽性能监控和故障管理软件,能监控并收集来自路由器.交换机 ...

  4. Autoencoders and Sparsity(一)

    An autoencoder neural network is an unsupervised learning algorithm that applies backpropagation, se ...

  5. VMware Vsphere 6.0安装部署 总体部署架构

    (一)总体部署架构 本教程用于学习目的,力求详尽的介绍安装部署过程和各组件之间的关系,部署过程从最简单的模型开始,系列文章按时间顺序依次展开,每篇介绍一个组件. 开始阶段,按照一台物理服务器,部署所有 ...

  6. 怎样扩展Chromium各层的接口

    加入新功能时,可能须要添加各层的接口,接口怎样加?必定须要向Chromium的原则看齐. 首先Chromium的模块设计遵循依赖倒置原则,上层模块依赖于低层模块.低层模块不会依赖上层模块的实现. 再者 ...

  7. oracle 10g standby database 实时应用 redo 数据

    -------physical standby database: real-time apply 须要配置 standby redo log: 启用实时应用, 日志应用服务会直接应用接收的redo ...

  8. HDU 1166 敌兵布阵 Segment Tree题解

    本题是最主要的分段树操作了.或者一般叫线段树,只是好像和线段没什么关系,仅仅是分段了. 不使用lazy标志,更新仅仅是更新单点. 假设不使用分段树,那么更新时间效率仅仅须要O(1),使用分段树更新效率 ...

  9. ViewPager 入门一

    使用ViewPager能够得到不同view的切换效果 例如以下图,实现了四个view间的相互滑动 一.新建项目,引入ViewPager控件 ViewPager.它是google SDk中自带的一个附加 ...

  10. inflater-布局转化实现

    通俗的说,inflate就相当于将一个xml中定义的布局找出来.因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组件 ...