`
这些年
  • 浏览: 387987 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring mvc 异常处理(转)

 
阅读更多

链接:http://gaojiewyh.iteye.com/blog/1297746 (附源码)
链接:http://zywang.iteye.com/blog/983801 
链接:http://www.cnblogs.com/xguo/p/3163519.html 
链接:http://fuliang.iteye.com/blog/947191 
链接:http://blog.csdn.net/FansUnion/article/details/17038103

链接:http://cgs1999.iteye.com/blog/1547197(附源码)

 

      Spring3.0对异常的处理通过HandlerExceptionResolver来实现。HandlerExceptionResolver有4个实现类DefaultHandlerExceptionResolver、AnnotationMethodExceptionResolver、ResponseStatusExceptionResolver、SimpleMappingExceptionResolver。
      Spring3.0对异常的处理主要可通过这两种方式:一种是使用HandlerExceptionResolver接口;一种是在@Controller处理器内部使用@ExceptionHandler注解。使用第一种方式可以实现全局异常控制,并且Spring已经提供了一个默认的实现类SimpleMappingExceptionResolver;使用第二种方式可以在Controller内部实现更个性化异常处理方式。

 

---方式一:HandlerExceptionResolver接口,复写resolveException()方法
      springmvc通过HandlerExceptionResolver处理程序的异常,该接口仅有一个方法ModelAndView  resolveException(HttpServletRequest request,              HttpServletResponse response, Object handler, Exception ex)。我们可复写该方法实现全局异常的处理。
      当发生异常时,springmvc会调用resolveException()方法,并返回一个ModelAndView对象。如果该方法返回了null,Spring会搜索所有注册在其环境中的实现了HandlerExceptionResolver接口的Bean,逐个执行,直到返回一个ModelAndView对象,最后转到ModelAndView对应的视图作为一个异常报告页面!

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 基于HandlerExceptionResolver接口的异常处理类 
  3.  * 这个类必须声明到Spring中去,让Spring管理它,你可以使用@Component标签: 
  4.  *   <context:component-scan base-package="test.*" /> 
  5.  * 或者使用在配置文件通过<bean/>节点配置: 
  6.  *   <bean id="exceptionResolver" class="test.CustomExceptionHandler "/> 
  7.  */  
  8. @Component  
  9. public class CustomExceptionHandler implements HandlerExceptionResolver {  
  10.     @Override  
  11.     public ModelAndView resolveException(HttpServletRequest request,  
  12.             HttpServletResponse response, Object object, Exception exception) {  
  13.         if(exception instanceof IOException){  
  14.             return new ModelAndView("ioexp");  
  15.         }else if(exception instanceof SQLException){  
  16.             return new ModelAndView("sqlexp");  
  17.         }  
  18.         return null;  
  19.     }  
  20. }  

---区分ajax请求和普通http请求进行异常处理返回:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 代码2: 
  3.  * 说明:当在系统应用中出现普通异常时,根据是系统异常还是应用异常,跳到相应的界面, 
  4.  * 当ajax异常时,在ajax的error中可直接获得异常。普通的异常我们都配置好了界面,系统会自动跳转。 
  5.  */  
  6. public class CustomSimpleMappingExceptionResolver extends SimpleMappingExceptionResolver {  
  7.     @Override  
  8.     protected ModelAndView doResolveException(HttpServletRequest request,  
  9.             HttpServletResponse response, Object handler, Exception ex) {  
  10.         // Expose ModelAndView for chosen error view.  
  11.         String viewName = determineViewName(ex, request);  
  12.         if (viewName != null) {// JSP格式返回  
  13.             if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request  
  14.                     .getHeader("X-Requested-With")!= null && request  
  15.                     .getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {  
  16.                 // 如果不是异步请求  
  17.                 // Apply HTTP status code for error views, if specified.  
  18.                 // Only apply it if we're processing a top-level request.  
  19.                 Integer statusCode = determineStatusCode(request, viewName);  
  20.                 if (statusCode != null) {  
  21.                     applyStatusCodeIfPossible(request, response, statusCode);  
  22.                 }  
  23.                 return getModelAndView(viewName, ex, request);  
  24.             } else {// JSON格式返回  
  25.                 try {  
  26.                     PrintWriter writer = response.getWriter();  
  27.                     writer.write(ex.getMessage());  
  28.                     writer.flush();  
  29.                 } catch (IOException e) {  
  30.                     e.printStackTrace();  
  31.                 }  
  32.                 return null;  
  33.             }  
  34.         } else {  
  35.             return null;  
  36.         }  
  37.     }  
  38. }  


---方式二:@ExceptionHandler

 

AnnotationMethodExceptionResolver:springmvc也默认配置了AnnotationMethodExceptionResolver,它允许通过@ExceptionHandler指定处理特定异常的方法。@ExceptionHandler:处理同一个类内触发的局部异常(如果要让其处理多个需拦截异常的处理器,则可另其他类继承此类!)

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Controller  
  2. //可以被其他处理器继承  
  3. public class MyExceptionFilter {  
  4.     ...  
  5.     //该处理器类中的所有方法抛出的异常都可由此方法捕获并处理  
  6.     //该注解也可制定多个异常类,如@ExceptionHandler(value={IOException.class,SQLException.class})    
  7.     @ExceptionHandler(Exception.class)  
  8.     public String handleException(Exception e, HttpServletRequest req) {          
  9.   
  10.         System.out.println("exception name: " + e.getClass().toString());//异常名  
  11.         System.out.println("exception cause: " + e.getCause());  
  12.         System.out.println("exception msg: " + e.getLocalizedMessage());  
  13.         //e.printStackTrace();   
  14.         StackTraceElement[] ste = e.getStackTrace();  
  15.         StringBuffer sb_e = new StringBuffer();  
  16.         for(int j=0;j<ste.length;j++){  
  17.             if(ste[j].toString().contains("xxxx")) {  
  18.                 sb_e.append(ste[j].toString()+",  ");  
  19.             }  
  20.         }     
  21.         System.out.println("Exception detail: ");//异常详细信息  
  22.         System.out.println(sb_e.toString());  
  23.           
  24.         StringBuffer sbUrl = new StringBuffer();//拼url  
  25.         System.out.println("request method: "+req.getMethod());//get,post  
  26.         System.out.println("request encode: " + req.getCharacterEncoding());//编码  
  27.         System.out.println("request mapping: "+req.getRequestURL().toString());//请求url方法  
  28.         sbUrl.append(req.getRequestURL().toString());  
  29.         Enumeration en = req.getParameterNames();//请求参数-值  
  30.         for(int i=0; en.hasMoreElements(); i++){  
  31.             String arg = en.nextElement().toString();  
  32.             if(i==0){  
  33.                 sbUrl.append("?");  
  34.             }else{  
  35.                 sbUrl.append("&");  
  36.             }  
  37.             sbUrl.append(arg + "=" + req.getParameterValues(arg)[0]);  
  38.         }  
  39.         System.out.println("request url: " + sbUrl.toString());       
  40.           
  41. //      if(ex instanceof BusinessException) {    
  42. //          return "error-business";    
  43. //      }else if(ex instanceof ParameterException) {    
  44. //          return "error-parameter";    
  45. //      } else {    
  46. //          return "error";    
  47. //      }    
  48.         return "forward:error.jsp";  
  49.     }  
  50. }  

 

 

 


---方式三:SimpleMappingExceptionResolver

 

SimpleMappingExceptionResolver:可对全局异常进行统一处理。

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.     <!--设置日志输出级别,不定义则默认不输出警告等错误日志信息。链接:http://elf8848.iteye.com/blog/875830 -->      
  3.     <property name="warnLogCategory" value="WARN" />    
  4.     <!-- 默认错误页面,就是不在exceptionMappings指定范围内 -->  
  5.     <property name="defaultErrorView" value="error"></property>  
  6.     <!-- 定义需要特殊处理的异常,如当发生IOException异常时跳转到error/ioexp视图-->  
  7.     <property name="exceptionMappings"><span style="font-family: Arial, Helvetica, sans-serif;"><!—key为异常类,可以是全路径,错误页面或Controller路径!会自动跳转到对应url --></span>        
  8.         <props>  
  9.             <prop key="IOException">redirect:/login</prop>  
  10.             <prop key="java.sql.SQLException">error/sqlexp</prop>  
  11.         </props>  
  12.     </property>  
  13. </bean>  


---方式四:<error-page>
DefaultHandlerExceptionResolver:Springmvc默认装配了DefaultHandlerExceptionResolver,它会将springmvc的异常转换成对应的响应状态码(500,404等)。对于Unchecked Exception而言,由于代码不强制捕获,往往被忽略,如果运行期产生了Unchecked Exception,而代码中又没有进行相应的捕获和处理,则我们可能不得不面对尴尬的404、500……等服务器内部错误提示页面。 
      我们需要一个全面而有效的异常处理机制。目前大多数服务器也都支持在web.xml中通过<error-page>(Websphere/Weblogic)或者<error-code>(Tomcat)节点配置特定异常情况的显示页面。(springmvc)操作如下:
1.在web.xml中配置响应状态码对应的页面,如:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <error-page>    
  2.     <error-code>500</error-code>    
  3.     <location>/WEB-INF/pages/error/500.jsp</location>    
  4. </error-page>   
  5. <!-- 未捕获的错误,同样可指定其它异常类,或自定义异常类 -->  
  6. <error-page>  
  7.     <exception-type>java.lang.Exception</exception-type>  
  8.     <location>/uncaughtException</location>  
  9. </error-page>  

2. applicationContext.xml中配置

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!-- 错误路径和错误页面,注意指定viewResolver -->  
  2. <mvc:view-controller path="/404" view-name="404"/>  
  3. <mvc:view-controller path="/500" view-name="500"/>  
  4. <mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/>  

附:https://www.google.com.hk/search?newwindow=1&safe=strict&espv=210&es_sm=93&q=error+page%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8&revid=601630396&sa=X&ei=ORwOU7K_INKbiQeTjIG4BA&ved=0CIcBENUCKAE&biw=1440&bih=737 

---方式五:Spring3.2新注解@ControllerAdvice
链接:http://jinnianshilongnian.iteye.com/blog/1866350  
        @ControllerAdvice,是spring3.2提供的新注解。会把@ControllerAdvice注解内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的 @RequestMapping注解的方法(全局的)

      有一次发现springmvc3.2.x的@ControllerAdvice注解不起作用,参考链接http://www.07net01.com/linux/spring3_2_mvc__ControllerAdvice_buqizuoyong_554229_1375786240.html加上@EnableWebMvc后就可以了。但是,后来又发现会导致这个原因是因为项目的springmvc配置文件中没有配置<mvc:annotation-driven />,于是将其配置上。但是配置上<mvc:annotation-driven />后问题就来了,启动的时候就报异常,看了下原因,感觉是@EnableWebMvc注解导致的,于是将该注解删除掉,果然就正常启动了。不过,至于其中的原理还是理解不深刻,不知道内部是怎么调用的,只是发现当配置上<mvc:annotation-driven />的时候不应该用@EnableWebMvc修饰@ControllerAdvice。(待研究)附链接:http://hahalq.iteye.com/blog/1738599。http://www.yulezhandian.com/?p=196。

      测试后发现,当全局异常和局部异常都存在时,全局异常处理会被局部异常处理覆盖。

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 全局异常 
  3.  */  
  4. //@EnableWebMvc  
  5. @ControllerAdvice  
  6. public class MyExceptionHandler {  
  7.       
  8.     @ExceptionHandler(Exception.class)  
  9.     public String handleException(Exception re, HttpServletRequest request) {  
  10.         System.out.println("error.......");  
  11.         return "forward:error.jsp";  
  12.     }  
  13. }  
分享到:
评论

相关推荐

    spring mvc异常处理

    spring mvc异常处理,详细参考http://blog.csdn.net/xiejx618/article/details/41918611

    spring mvc统一处理异常

    spring mvc统一处理异常,通过@ControllerAdvice+@ExceptionHandler

    spring mvc异常简单处理

    spring mvc让servlet容器直接处理异常.详细看:http://blog.csdn.net/xiejx618/article/details/41695255

    SpringMVCDemo:Spring MVC 框架知识案例

    1.创建第一个 Spring MVC 程序案例 2.Spring MVC @RequestMapping 注解案例 3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 5.Spring MVC @ModelAttribute 注解案例 ...15.Spring MVC 异常处理案例

    Spring MVC入门教程

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

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

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

    Spring MVC+MyBatis开发从入门到项目实战

    第3篇是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和拦截...

    SpringMVC框架架构介绍

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

    三. spring mvc 异常统一处理

    NULL 博文链接:https://gaojiewyh.iteye.com/blog/1297746

    spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常.zip

    spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常 spring REST异常处理程序 这个项目的目的是为for提供一个方便的异常处理程序( 解析器),它满足了错误响应的最佳实践。 处理自定义异常。...

    springmvc 异常统一处理的三种方式详解.docx

    那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的。下面将介绍使用Spring MVC统一处理异常的解决和实现过程。

    spring-mvc-error-handling-example:Spring MVC错误处理示例

    Spring Boot & Spring MVC 异常处理的N种方法 参考文档: Spring Boot 1.5.4.RELEASE Spring framework 4.3.9.RELEASE 默认行为 根据Spring Boot官方文档的说法: For machine clients it will produce a JSON ...

    Spring MVC异常处理机制示例详解

    主要给大家介绍了关于Spring MVC异常处理机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring MVC具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Spring MVC 3.0实战指南.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7...

    Spring MVC--9.自定义拦截器、异常处理

    Spring MVC--9.自定义拦截器、异常处理

    使用Spring MVC统一异常处理实战

    NULL 博文链接:https://cgs1999.iteye.com/blog/1547197

    Spring3MVC注解教程.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及...

    Spring MVC REST异常处理佳实践(下)

     Spring 异常处理  Spring MVC 有两个主要方式来处理在调用 MVC 控制器(译注:Controller,下文统一为控制器)时抛出的异常:HandlerExceptionResolver 和 @ExceptionHandler 注解。  ...

    详解Spring MVC/Boot 统一异常处理最佳实践

    在 Web 开发中, 我们经常会需要处理各种异常,这篇文章主要介绍了详解Spring MVC/Boot 统一异常处理最佳实践,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Global site tag (gtag.js) - Google Analytics