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. 2.5. Integer 16 、Integer 32、Integer 64(Core Data 应用程序实践指南)

    Core Data 使用 “带符号的整数”,通常我们会选择Integer 32,如果不够,可以升级为Integer 64 (第3章),通过升级托管对象模型. 这三种类型对应的特性(Property)类 ...

  2. 编写快速、高效的JavaScript代码

    许多Javascript引擎都是为了快速运行大型的JavaScript程序而特别设 计的,例如Google的V8引擎(Chrome浏览器,Node均使用该引擎).在开发过程中,如果你关心你程序的内存和 ...

  3. 常用的.net开源项目

    Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Li ...

  4. 基于.NET Core的Hypertext Application Language(HAL)开发库

    HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...

  5. 常用js类型相互转换

    数字转换为字符串 var a=200.21;document.write(a.toString(10));  结果为:200.21以十进制转换 document.write(a.toFixed(3)) ...

  6. [nginx]Windows和Mac下,nginx反向代理服务器配置

    最近做项目,前端需要用到nginx反向代理来转发请求,总结了一下在Windows和Mac上的配置,以备查询. 一.Windows 修改nginx的配置文件,nginx.conf. 1)nginx.co ...

  7. Ceph QoS 初探(下)

    作者:吴香伟 发表于 2017/01/24 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 存储QoS是个可以做很大也可以做很小的特性.SolidFire认为将Q ...

  8. ArcGIS Pro 简明教程(1)Pro简介

    ArcGIS Pro 简明教程(1)Pro简介 ArcGIS Pro已经发布了相当的一段时间了,截至笔者写这系列文章的时候已经是1.3版本了,已经是相当完善的一个版本,基本上已经完成了原来ArcGIS ...

  9. (@WhiteTaken)设计模式学习——单例模式

    单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访 ...

  10. 使用LVS实现负载均衡原理及安装配置详解

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...