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

spring3.0异常处理进阶

 
阅读更多

spring3.0开发不可避免要遇到异常处理,如果只有jsp请求能捕获到异常,是不足够的, 有时候AJAX返回json数据时遇到异常。这时候默认的处理方式不能满足了, 需要自定义的方式支持同步和ajax异步异常处理。

 

 或许大家都知道spring3的异常处理方法有:

1   以配置文件的方式进行异常管理

在配置dispacher-servlet.xml

 

[xhtml] view plaincopy
 
  1. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.   
  3.     <property name="defaultErrorView">  
  4.       <value>jsonView</value>  
  5.     </property>  
  6.    <property name="exceptionMappings">  
  7.       <props>  
  8.     <prop key="java.lang.Exception">/common/error.jsp</prop>     
  9.       </props>   
  10.     </property>  
  11.   </bean>  

 

配置多个异常处理的地方

 

2  以注解的方式配置异常管理

 为了方便阅读, 把代码的地方发全一点

 

[java] view plaincopy
 
  1. @Controller  
  2. public class ExceptionHandlerController  
  3. {  
  4.     private final Logger log = LoggerFactory.getLogger(getClass());  
  5.       
  6.     @ExceptionHandler(ManagerSecurityException.class)  
  7.     public ModelAndView handleManagerSecurityException(ManagerSecurityException e,  
  8.             HttpServletResponse response)  
  9.     throws IOException  
  10.     {  
  11.         log.info("Manager exception handler " + e.getMessage());  
  12.           
  13.         response.sendError(HttpServletResponse.SC_FORBIDDEN,  
  14.             e.getMessage());  
  15.          return new ModelAndView("viewName",new HashMap());  
  16.     }  
  17. }  

 

这样的配置处理jstl请求jsp没有问题, 

如果是jquery的 $.post的方法请求, 那么如果还是返回   error.jsp  , 那在  js的success函数里则不能很好地输出显示了。

 

问题又来了:  如果在 handleManagerSecurityException方法的上面打上注解 @ResponeBody

那么这样又只能返回 json格式串的异常处理, 你想同步请求跳到到error.jsp又不行啦!

 

解决办法是这样的:定制化异常处理

 

 

[xhtml] view plaincopy
 
  1. <bean id="exceptionResolver" class="com.wsd.core.web.servlet.handle.CustomSimpleMappingExceptionResolver">  
  2.         <property name="defaultErrorView">  
  3.             <value>/common/error.jsp</value>  
  4.         </property>  
  5.     <property name="exceptionMappings">  
  6.         <props>  
  7.             <prop key="java.lang.Exception">/common/error.jsp</prop>     
  8.         </props>   
  9.     </property>  
  10.     </bean>  

 

 

下面我们来看看CustomSimpleMappingExceptionResolver.java是如何做到支持JSP和JSON格式返回的异常错误的

 

 

[java] view plaincopy
 
  1. @Override  
  2. protected ModelAndView doResolveException(HttpServletRequest request,  
  3.         HttpServletResponse response,  
  4.         Object handler,  
  5.         Exception ex) {  
  6.   
  7.     // Expose ModelAndView for chosen error view.  
  8.     String viewName = determineViewName(ex, request);  
  9.     if (viewName != null) {//JSP格式返回  
  10.         if(!(request.getHeader("accept").indexOf("application/json")>-1 || request.getHeader("X-Requested-With").indexOf("XMLHttpRequest")>-1)){//如果不是异步请求  
  11.             // Apply HTTP status code for error views, if specified.  
  12.             // Only apply it if we're processing a top-level request.  
  13.             Integer statusCode = determineStatusCode(request, viewName);  
  14.             if (statusCode != null) {  
  15.                 applyStatusCodeIfPossible(request, response, statusCode);  
  16.                 return getModelAndView(viewName, ex, request);  
  17.             }  
  18.         }else{//JSON格式返回  
  19.             Map<String, Object> model=new HashMap<String, Object>();  
  20.             if(this.logger.isDebugEnabled()){  
  21.                 model.put("debug"true);   
  22.             }//exception  
  23.             model.put(ConfigConstants.RESULT, ex.getMessage());  
  24.             model.put("failure"true);  
  25.             try {  
  26.                 response.getWriter().write("有异常啦!");  
  27.             } catch (IOException e) {  
  28.                 e.printStackTrace();  
  29.             }  
  30.             return new ModelAndView();  
  31.         }  
  32.         return null;  
  33.     }  
  34.     else {  
  35.         return null;  
  36.     }  
  37. }  

 

 

这里判断了request.getHeader("accept").indexOf("application/json")是不是异步请求

下面给出同步和异步请求的Header

同步的text/html

=== MimeHeaders ===
host = localhost:8888
user-agent = Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language = en,zh;q=0.7,en-gb;q=0.3
accept-encoding = gzip,deflate
accept-charset = ISO-8859-1,utf-8;q=0.7,*;q=0.7
keep-alive = 115
connection = keep-alive
cookie = JSESSIONID=BB7441E4B481FF64A5BCC8E6F596C330

 

异步的application/json
=== MimeHeaders ===
host = localhost:8888
user-agent = Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
accept = application/json, text/javascript, */*
accept-language = en,zh;q=0.7,en-gb;q=0.3
accept-encoding = gzip,deflate
accept-charset = ISO-8859-1,utf-8;q=0.7,*;q=0.7
keep-alive = 115
connection = keep-alive
content-type = application/x-www-form-urlencoded
x-requested-with = XMLHttpRequest
referer = http://localhost:8888/auth/auth/dictionary/dictionaryForm.html
cookie = JSESSIONID=A4B59EA87C9B83B71C0D455634746411

 

请注意

try {
     response.getWriter().write("有异常啦!");
    } catch (IOException e) {
     e.printStackTrace();
    }
    return new ModelAndView();

 

关键就在最后这1句   return new ModelAndView();

为什么不写 return null;   或者  return new ModelAndView('jsonView', model); 呢?

 

因为spring3的源码里这样写着了

 

[java] view plaincopy
 
  1. protected ModelAndView processHandlerException(HttpServletRequest request,  
  2.         HttpServletResponse response,  
  3.         Object handler,  
  4.         Exception ex) throws Exception {  
  5.   
  6.     // Check registerer HandlerExceptionResolvers...  
  7.     ModelAndView exMv = null;  
  8.     for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {  
  9.         exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);  
  10.         if (exMv != null) {  
  11.             break;  
  12.         }  
  13.     }  
  14.     if (exMv != null) {  
  15.         if (exMv.isEmpty()) {  
  16.             return null;  
  17.         }  
  18.         if (logger.isDebugEnabled()) {  
  19.             logger.debug("Handler execution resulted in exception - forwarding to resolved error view: " + exMv,  
  20.                     ex);  
  21.         }  
  22.         WebUtils.exposeErrorRequestAttributes(request, ex, getServletName());  
  23.         return exMv;  
  24.     }  
  25.   
  26.     throw ex;  
  27. }  

 

 

注意看

  if (exMv != null) {
   if (exMv.isEmpty()) {
    return null;
   }

这句和最后一句:  throw ex;

 

如果你写 respone.getWriter().write("有异常啦");   你也要  new一个空的ModelAndView,

上面的代码表明, 如果你 return null;  它就跑出异常  throw ex;    如果没人接收, 则会调用你配置的默认异常处理器

或者中断不做任何输出。

 

好了, 这样可以同时支持同步和AJAX异步请求异常处理了。

 

下面附上截图, 以免误人子弟~

 

分享到:
评论

相关推荐

    详尽的Spring2.0学习提纲

    2. 高级特性实践:探索Spring Security、Spring WebSocket、Spring Boot等进阶主题,提升项目开发能力。 通过以上学习,你可以全面掌握Spring 2.0的核心技术和应用,为成为熟练的Spring开发者奠定坚实的基础。在...

    Spring2.5、3.0、3.1轻松入门+中级+高级教程14合一

    - **学习笔记_7[1].4__Spring_MVC提供的更多功能**: 这部分可能会介绍Spring MVC的高级特性,比如视图解析器、拦截器、异常处理以及自定义转换器和格式化器。 - **Spring_MVC_3[1].0.5+Spring_3.0.5+MyBatis3.0.4全...

    2023-04-13-框架技术-Springmvc进阶+文件上传.zip

    6. **异步处理**:Spring MVC支持Servlet 3.0的异步处理,通过`@Async`注解实现后台任务的异步执行。 接下来,我们讨论文件上传功能: 7. **文件上传API**:在Spring MVC中,`MultipartFile`接口用于处理上传的...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    25号05: Spring MVC1课堂内容

    在"25号05:Spring MVC1课堂内容"中,我们可以推测这是一个教学资源,涵盖了Spring MVC的基础到进阶知识,可能包括了从版本v01到v02的更新内容,特别是针对测试类的优化和使用。 1. **Spring MVC 概述**: Spring ...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Java面试突击-V3.0_Java面试文档_java面试_面试_

    这份文档详细涵盖了Java编程语言的各个方面,包括基础概念、进阶特性、并发处理、内存管理、垃圾收集、集合框架、IO流、网络编程、设计模式以及框架应用等核心知识点。以下是对这些关键领域的详细阐述: 1. **Java...

    Java面试突击-V3.0.rar

    再者,异常处理是Java程序设计中的关键环节。面试中可能会询问如何正确地使用try-catch-finally语句,以及何时使用checked异常和unchecked异常。理解并能灵活运用finally块,以及自定义异常的创建,都是展示你编程...

    Java面试突击-V3.0.pdf

    在Java基础方面,资料详细介绍了Java的基本语法、面向对象编程、异常处理、集合框架等内容,为初学者打下坚实的基础。在此基础上,资料又进一步深入到Java的高级特性,例如泛型、IO流、多线程与并发、网络编程等,让...

    upload spring mvc

    - 使用`CommonsMultipartResolver`的替代品:Spring Boot 2.1及以上版本推荐使用`MultipartResolver`接口的实现类`StandardServletMultipartResolver`,它集成了Servlet 3.0的多部分解析。 - 大文件上传:对于大文件...

    高级篇.pdf

    Spring Framework 6.0和Spring Boot 3.0进一步增强了微服务架构的支持。HTTP/2和HTTP/3的使用可以提高网络通信效率。了解如何分析和解决CPU利用率飙升、慢SQL、内存溢出和线程死锁等问题,是系统维护的重要技能。...

    java自学路线

    - **异常处理**:掌握异常处理机制,提高程序的健壮性。 #### 七、XML技术 ##### 1. XML基础知识 - **文档类型定义(DTD)与模式(Schema)**:理解DTD与Schema的作用及区别。 - **XSLT与XPath**:学习如何使用XSLT...

    JAVA---------笔试面试题

    2. **异常处理:** 掌握如何使用try-catch-finally语句,理解Checked和Unchecked异常,以及如何自定义异常。 3. **内存管理:** 理解Java内存模型,包括堆内存、栈内存、方法区、本地方法栈,以及垃圾收集机制和...

    Java自学之路之自学线路图

    JavaSE(Java Standard Edition)是学习Java的第一步,它包括Java语法、面向对象编程概念、异常处理、集合框架、多线程、输入/输出流等基础知识。在学习JavaSE的同时,建议同步学习数据结构与算法,这是提升编程能力...

    传智播客java就业班2010全部PPT

    2. **异常处理**:如何通过try-catch-finally语句块来捕获和处理运行时异常,提高代码的健壮性。 3. **集合框架**:详述ArrayList、LinkedList、HashMap、HashSet等常用集合类的使用,以及集合的遍历、查找、排序...

    j2ee学习路径 对初学者很有帮助

    理解ActionForm、Action和ActionForward的使用,以及如何实现国际化(I18N)和异常处理。 7. **XML**:XML是数据交换和配置文件的标准,学习XML的基础,包括XSL、XSLT、DTD和Schema,虽然Java编程可以直接跳过,但...

    Java Servlets 参考大全源代码

    9. **chapter15.zip** - 最后一个章节可能涉及高级主题,如Servlet 3.0及以上版本的新特性,如注解驱动的Servlet配置,以及MVC框架如Spring MVC的简要介绍。 10. **JSDGSource.zip** - 这个文件名暗示可能是《Java ...

    java学习路线

    - 学习异常处理机制,理解如何编写健壮的代码。 - **数据库交互**: - **第四阶段**:学习使用JDBC(Java Database Connectivity)进行数据库操作。JDBC提供了标准接口来访问关系型数据库,包括连接数据库、执行...

Global site tag (gtag.js) - Google Analytics