`
这些年
  • 浏览: 399791 次
  • 性别: 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中的异常处理机制,帮助你更好地理解如何优雅地处理错误和异常。 1. **Spring MVC 异常处理概述** Spring MVC 提供了一种统一的方式来处理应用程序中抛出的异常。它通过`@...

    spring mvc统一处理异常

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

    spring mvc异常简单处理

    在Spring MVC框架中,异常处理是一项关键任务,它确保了应用程序在遇到错误或异常时能够优雅地响应。本文将深入探讨Spring MVC中的异常处理机制,包括如何配置、自定义异常处理器以及异常转换策略。 首先,Spring ...

    最全最经典spring-mvc教程

    错误处理和异常处理也是Spring MVC中的重要部分,通过@ControllerAdvice和@ExceptionHandler可以全局处理异常,提供统一的错误页面。 最后,测试是任何应用程序开发的重要环节。Spring MVC提供了MockMVC,可以在不...

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

    十一、Spring MVC如何实现全局的异常处理:提供了实现全局异常处理器的方式,让开发者能够捕获所有控制器抛出的异常,统一处理。 十二、Spring MVC如何把全局异常记录到日志中:讲述了如何将异常信息记录到日志文件...

    Spring MVC 4.2.3

    6. **异常处理**:通过定义全局异常处理器,可以统一处理应用程序中的异常,提高代码的整洁性和可维护性。 7. **多视图解析器**:Spring MVC支持多种视图解析器,如JSP、FreeMarker、Thymeleaf等,可以根据项目需求...

    spring mvc 4.0

    8. **异步处理**:Spring MVC 4.0引入了异步请求处理,通过@ControllerAdvice和@Async注解,可以实现后台任务的异步执行,提高响应速度。 9. **多Part文件上传**:支持多文件上传,利用MultipartFile接口处理上传...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    除此之外,Spring MVC还支持数据绑定、验证、本地化、主题、异常处理等功能。例如,使用@ModelAttribute注解可以将请求参数绑定到Controller方法的参数上,@Valid用于进行数据验证,Validator接口可以自定义验证逻辑...

    Spring mvc 教程

    - **@ExceptionHandler 注解**:用于声明异常处理方法。 - **处理一般的 Spring MVC 异常**:Spring MVC 自身的一些异常可以在这里统一处理。 - **使用 @ResponseStatus 注解业务异常**:为自定义异常添加 HTTP 状态...

    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框架依赖全面jar

    `org.springframework.web-3.1.1.RELEASE.jar` 包含了Spring框架对Web应用的支持,如过滤器、异常处理和请求映射等。 `javassist-3.12.0.GA.jar` 是Java编程辅助工具,它在运行时可以动态修改类和创建新的类,常...

    Spring mvc5.0.3 所有jar包

    它还负责处理视图解析和异常处理。 2. **Model-View-Controller(MVC)架构**: Spring MVC遵循MVC设计模式,将应用程序逻辑分解为模型(Model)、视图(View)和控制器(Controller)三个部分。模型处理业务逻辑,...

    Spring MVC 4.2.4.RELEASE 中文文档

    异常处理** 通过自定义异常处理器,Spring MVC允许优雅地处理运行时异常,提供了统一的错误页面和异常信息。 **7. RESTful支持** Spring MVC支持构建RESTful服务,通过HTTP方法如GET、POST、PUT、DELETE等,实现...

    spring mvc 整合包

    13. **异常处理**:通过@ControllerAdvice和@ExceptionHandler注解,可以全局处理异常,提供统一的错误页面。 14. **RESTful风格**:Spring MVC支持创建RESTful API,通过HTTP方法(GET、POST、PUT、DELETE等)和...

Global site tag (gtag.js) - Google Analytics