Spring MVC异常处理SimpleMappingExceptionResolver【转】

(2012-12-07 13:45:33)

标签:

杂谈

分类: 技术分享

Spring3.0中对异常的处理方法一共提供了两种:一种是使用HandlerExceptionResolver接口;一种是在Controller类内部使用@ExceptionHandler注解。使用第一种方式可以实现全局异常控制,并且Spring已经提供了一个默认的实现类SimpleMappingExceptionResolver;使用第二种方式可以在Controller内部实现更个性化点异常处理方式,灵活性更高。一般来说,项目中只需要采用第一种方式就可以了,每个人都自己定义异常的展现方式,太过个性了,不统一。

从目前的调查结果看,这两种方式不能共存,不知道未来的版本是否能将他们合二为一,这样才能灵活配置。

基于HandlerExceptionResolver接口的异常处理:

使用这种方式只需要实现resolveException方法,该方法返回一个ModelAndView对象,在方法内部对异常的类型进行判断,然后常见合适的ModelAndView对象,如果该方法返回了null,则Spring会继续寻找其他的实现了HandlerExceptionResolver 接口的Bean。换句话说,Spring会搜索所有注册在其环境中的实现了HandlerExceptionResolver接口的Bean,逐个执行,直到返回了一个ModelAndView对象。

示例代码:

Java代码  
  1. public class CustomExceptionHandler implements HandlerExceptionResolver {
  2. @Override
  3. public ModelAndView resolveException(HttpServletRequest request,
  4. HttpServletResponse response, Object object, Exception exception) {
  5. if(exception instanceof IOException){
  6. return new ModelAndView("ioexp");
  7. }else if(exception instanceof SQLException){
  8. return new ModelAndView("sqlexp");
  9. }
  10. return null;
  11. }
  12. }

这个类必须声明到Spring中去,让Spring管理它,你可以使用@Component标签,也可以使用<bean/>节点。为了简单的进行异常处理,Spring提供了SimpleMappingExceptionResolver类,该类实现了HandlerExceptionResolver接口,需要使用时只需要使用<bean/>节点进行声明即可,示例如下:

Xml代码  
  1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  2. <!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->
  3. <property name="defaultErrorView" value="error"></property>
  4. <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
  5. <property name="exceptionAttribute" value="ex"></property>
  6. <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页名作为值 -->
  7. <property name="exceptionMappings">
  8. <props>
  9. <prop key="IOException">error/ioexp</prop>
  10. <prop key="java.sql.SQLException">error/sqlexp</prop>
  11. </props>
  12. </property>
  13. </bean>
通过SimpleMappingExceptionResolver我们可以将不同的异常映射到不同的jsp页面(通过exceptionMappings属性的配置),同时我们也可以为所有的异常指定一个默认的异
常提示页面(通过defaultErrorView属性的配置),如果所抛出的异常在exceptionMappings中没有对应的映射,则Spring将用此默认配置显示异常信息(注意这里配置的异常显示界面均仅包括主文件名,至于文件路径和后缀已经在viewResolver中指定)。

一个典型的异常显示页面如下: 
<html> 
<head><title>Exception!</title></head> 
<body> 
<% Exception ex = (Exception)request.getAttribute("exception"); %> 
<H2>Exception: <%= ex.getMessage();%></H2> 
<P/> 
<% ex.printStackTrace(new java.io.PrintWriter(out)); %> 
</body> 
</html> 
exception 实在SimpleMappingExceptionResolver 被存放到request中的,具体可以查看源代码。 
如果SimpleMappingExceptionResolver无法满足异常处理的需要,我们可以针对 
HandlerExceptionResolver接口实现自己异常处理类,这同样非常简单(只需要实现一个 
resolveException方法)。

如果有ViewResolver,则制定的jsp页面必须在那个页面下,到时候如果找不到页面,可以根据错误提示再调整页面路径

基于@ExceptionHandler的异常处理:

该方法需要定义在Controller内部,然后创建一个方法并用@ExceptionHandler注解来修饰用来处理异常,这个方法基本和 @RequestMapping修饰的方法差不多,只是可以多一个类型为Exception的参数,@ExceptionHandler中可以添加一个或多个异常的类型,如果为空的话则认为可以触发所有的异常类型错误。

示例代码:

Java代码  
  1. @Controller
  2. public class ExceptionHandlerController {
  3. @ExceptionHandler(value={IOException.class,SQLException.class})
  4. public String exp(Exception ex,HttpServletRequest request) {
  5. request.setAttribute("ex", ex);
  6. return "/error.jsp";
  7. }
  8. }

spring exception的更多相关文章

  1. spring boot rest api exception解决方案

    1.控制器级别@ExceptionHandler public class FooController{           //...     @ExceptionHandler({ CustomE ...

  2. SpringBoot系列: Spring支持的异常处理方式

    ===================================视图函数返回 status code 的方式===================================Spring 有 ...

  3. Spring 添加属性集中常见方法

    //创建容器,索要对象, package cn.lijun.Test; import org.junit.Test;import org.springframework.context.Applica ...

  4. 12.Spring——Web MVC框架

    1.Spring Web MVC 框架 2.Spring MVC Hello World 例子 1.Spring Web MVC 框架 Spring web         MVC 框架提供了模型-视 ...

  5. [jOOQ中文]2. jOOQ与Spring和Druid整合

    https://segmentfault.com/a/1190000010496053 jOOQ和Spring很容易整合. 在这个例子中,我们将整合: Alibaba Druid(但您也可以使用其他连 ...

  6. Spring mvc解析

    方案时间 ,写代码时间 ,解决技术难点时间 , 自测时间,解决bug时间 , 联调时间 ,数据库优化,代码走查1个接口:2个小时 把那个字段再复原回来,不然兼容性不强还有一个刷数据的接口 public ...

  7. Spring(十九)之异常处理

    异常处理,对于项目开发至关重要,总不能用户点击一个页面出错了,直接报500,那样用户体验多不好啊! 所以这里讲的是SpringMVC对异常的处理,希望能给大家带来一定的 帮助和启发. 一.编写实体 p ...

  8. JWT和Spring Security集成

    通常情况下,把API直接暴露出去是风险很大的, 我们一般需要对API划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户对应的API (一)JWT是什么,为什么要使用它? 互联网服务离不开 ...

  9. [Spring cloud 一步步实现广告系统] 4. 通用代码模块设计

    一个大的系统,在代码的复用肯定是必不可少的,它能解决: 统一的响应处理(可以对外提供统一的响应对象包装) 统一的异常处理(可以将业务异常统一收集处理) 通用代码定义.配置定义(通用的配置信息放在统一的 ...

随机推荐

  1. LNAMP 中的PHP探针

    <?php /* ----------------本探针基于YaHei.net探针------------------- */ error_reporting(0); //抑制所有错误信息 @h ...

  2. java调用webservice

    http://www.cnblogs.com/sun_moon_earth/archive/2009/02/03/1383308.html http://www.cnblogs.com/siqi/ar ...

  3. P2P直播承载平台与CDN直播承载平台比较

    收看软件不一样:CDN直播收看无需安装第三方收看软件,一般操作系统已带播放器软件:P2P直播收看需要安装厂家自己的播放器软件,每家P2P的软件不兼容,收看者要装多套软件才能收看不同内容. 收看人数不一 ...

  4. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  5. 深入了解GCD

    首先提出一些问题: dispatch_async 函数如何实现,分发到主队列和全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 函数如何实现,为什么说 GCD 死锁是队列导致 ...

  6. PHP 7.1 新特性

    PHP 7.1 新特性 1.密集阵算法 2.php int64位支持(2GB的字符串和2GB的文件的上传) 3.$a<=>$b  操作符,排序时有用 4.标量的支持,如果声明int传入st ...

  7. C++编程练习(6)----“实现简单的队列的链式存储结构“

    队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #defi ...

  8. 简述jpg、gif、png-8、png-24的区别,分别使用场景

    gif.jpg.png格式的图片在网站制作中的区别 Gif 格式特点: 1.透明性:gif是一种布尔透明类型,即它可以使全透明,也可是全不透明,但是它并没有半透明的(alpha透明). 2.动画:gi ...

  9. Orcale 之基本术语二

    表空间 表空间是 Orcale 数据库最大的逻辑结构.表空间就是一个或者多个数据文件的集合.所有的数据文件都被逻辑的存放在表空间中. 一个数据库包括 SYSTEM.SYSAUX和TMP三个默认表空间, ...

  10. 基于Ubuntu14.04-LTS下安装docker

    1.sudo apt-get update --更新系统源 2.sudo apt-get install docker.io 3.将docker库的公钥中加入到本地apt中 sudo apt-key ...