`
songshidong
  • 浏览: 21094 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

springmvc配置全局异常处理

阅读更多

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

 

基于HandlerExceptionResolver接口的异常处理:

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

示例代码:

Java代码  
  1. /** 
  2.  * 基于HandlerExceptionResolver接口的异常处理类 
  3.  * @author ZYWANG 2011-4-2 
  4.  */  
  5. public class CustomExceptionHandler implements HandlerExceptionResolver {  
  6.   
  7.     @Override  
  8.     public ModelAndView resolveException(HttpServletRequest request,  
  9.             HttpServletResponse response, Object object, Exception exception) {  
  10.         if(exception instanceof IOException){  
  11.             return new ModelAndView("errors/ioException");  
  12.         }else if(exception instanceof SQLException){  
  13.             return new ModelAndView("errors/sqlException");  
  14.         }  
  15.         return null;  
  16.     }  
  17.   
  18. }  

这个类必须声明到Spring中去,让Spring管理它,你可以使用@Component标签,也可以使用<bean/>节点。(这就是spring的灵活性支持自己扩展)

为了简单的进行异常处理,Spring提供了SimpleMappingExceptionResolver类,该类实现了HandlerExceptionResolver接口,需要使用时只需要使用<bean/>节点进行声明即可,示例如下:

Xml代码  
 
    <!-- 全局异常配置 start  控制器异常处理--> 
        <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
            <property name="exceptionMappings"> 
                <props> 
                    <prop key="java.lang.Exception">errors/webException</prop> 
                    <prop key="java.lang.Throwable">errors/rmsException</prop> 
                </props> 
            </property> 
            <property name="statusCodes"> 
                <props> 
                    <prop key="errors/webException">500</prop> 
                    <prop key="errors/rmsException">404</prop> 
                </props> 
            </property> 
            <!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 --> 
            <property name="warnLogCategory" value="WARN"></property> 
            <!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 --> 
            <property name="defaultErrorView" value="errors/error"></property> 
            <!-- 默认HTTP状态码 --> 
            <property name="defaultStatusCode" value="500"></property> 
        </bean> 
        <!-- 全局异常配置 end --> 
通过SimpleMappingExceptionResolver我们可以将不同的异常映射到不同的jsp页面(通exceptionMappings属性的配置),同时我们也可以为所有的异常指定一个默认的异常提示页面(通过defaultErrorView属性的配置),如果所抛出的异常在exceptionMappings中没有对应的映射,则Spring将用此默认配置显示异常信息(注意这里配置的异常显示界面均仅包括主文件名,至于文件路径和后缀已经在viewResolver中指定)  <property name="defaultErrorView" value="errors/error"></property>

一个典型的异常显示页面如下: 
<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. /** 
  2.  * 基于@ExceptionHandler异常处理 
  3.  * @author ZYWANG 2011-4-2 
  4.  */  
  5. @Controller  
  6. public class ExceptionHandlerController {  
  7.       
  8.     @ExceptionHandler(value={IOException.class,SQLException.class})  
  9.     public String exp(Exception ex,HttpServletRequest request) {  
  10.         request.setAttribute("exception", ex);  
  11.         return "/error.jsp";  
  12.     }  
  13.   

分享到:
评论

相关推荐

    springmvc JSON解析全局异常处理

    通过aop拦截获取json请求数据,对数据进行处理判断,如果不合法则抛出异常,配置全局异常处理类,在异常处理类中直接将处理结果返回调用处,减少每次在方法中解析json数据然后在判断,减少代码冗余

    SSM笔记-SpringMVC的异常处理

    SSM笔记-SpringMVC的异常处理,包含了ExceptionHandler注解、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver、SimpleMappingExceptionResolver的使用和试验

    SpringMVC框架架构介绍

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求...

    SpringMVC入门教程

    十一、 spring mvc 如何实现全局的异常处理 十二、 spring mvc 如何把全局异常记录到日志中 十三、 如何给spring3 MVC中的Action做JUnit单元测试 十四、 spring mvc 转发与重定向 (带参数重定向) 十五、 spring ...

    mvc_action:项目中的功能技术点,整合到SpringMVC的示例

    业余时间,整合以前项目技术,创建springMVC示例,目前升级到4.3.13版本,您的宝贵意见,是我们进步的动力。...- 配置全局异常处理,mybatis,pagehelper分页。 - 配置通用日志打印,采用异步线程池日志写入

    基于Springboot+Mybatis+ SpringMvc+springsecrity+Redis完整网站后台管理系统

    对各种不同异常进行了全局统一处理 使用lombok简化java代码,让源码更简洁,可读性高 mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂sql采用Mapper.xml配置 使用了layui的弹出层、菜单、文件上传、富...

    multilingual.zip

    本项目使用了SpringBoot集成SSM,为所有Spring开发者更快的入门, 开箱即用,提供各种默认...SpringMVC是控制层 ,内置了全局异常捕捉功能,出现异常时可统一进行处理, 在实体类方面使用的是lombok简化冗余代码。

    Spring MVC入门教程

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...

    SpringBoot2.0实战教程

    6.扩展SpringMVC功能、全局异常处理 7.注册Servlet组件、配置外部的Servlet容器 8.SpringBoot数据访问(JDBC、MyBatis、Mybatis-Plus) 9.SpringBoot整合Redis 教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    Spring MVC 教程 快速入门 深入分析

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...

    SSM(详细注释代码清晰)开源框架

    05、框架实现了文件上传共通、电子文档导出、校验、全局异常处理、分页等共通,具体参见相关画面的相关功能; 06、通过注解方式实现事务控制,相关画面有测试代码,具体在哪可以自己找一下; 07、关于数据库链接,...

    java微信公众号MVC开发框架

    提供统一的异常处理机制 提供access_token自动更新机制 请求消息组装 灵活的响应消息类型 二、快速入门 本章教材提供一个最简单的例子,用户在微信公众号发一条foo的文本请求消息,公众号响应一条bar的文本响应消息...

    全新JAVAEE大神完美就业实战课程 超150G巨制课程轻松实战JAVAEE课程 就业部分.txt

    day07_solr集群搭建_全局异常处理 day08_activeMQ介绍_搭建_解决同步索引库问题 day09_FreeMark入门_静态化页面标签介绍_静态化页面实现 day10_Nginx代理详解..单点登录系统工程搭建_接口文档讲解 day11_单点...

    SpringBoot新手学习手册

    3.5、全局捕获异常 10 四、 数据访问 10 4.1、springboot整合使用JdbcTemplate 10 4.2、springboot整合使用mybatis 12 4.3、springboot整合使用springjpa 18 4.4、springboot整合多数据源 19 五、 事物管理 25...

    【JeeSpringCloud v3.2.4】后台权限管理系统+互联网云快速开发框架+微服务分布式代码生成

    异常邮件监控:全局拦截系统异常,并发送通知邮件。 单点登录:使用shior和Redis、共享session方式实现单点登录。 Redis分布式高速缓存:代码生成直接生成Redis对接代码。 特性: JeeSpringCloud基于SpringBoot+...

    【JeeSpringCloud v3.2.4】后台权限管理系统+互联网云快速开发框架+微服务分布式代码生成.zip

    异常邮件监控:全局拦截系统异常,并发送通知邮件。 单点登录:使用shior和Redis、共享session方式实现单点登录。 Redis分布式高速缓存:代码生成直接生成Redis对接代码。 特性: JeeSpringCloud基于SpringBoot+...

    JeeSpringCloud后台权限管理系统-其他

    异常邮件监控:全局拦截系统异常,并发送通知邮件。单点登录:使用shior和Redis、共享session方式实现单点登录。Redis分布式高速缓存:代码生成直接生成Redis对接代码。特性:JeeSpringCloud基于SpringBoot+SpringMVC+...

Global site tag (gtag.js) - Google Analytics