转载出处:http://fuliang.iteye.com/blog/947191

Spring MVC的确很强大,在每一个你想的到和想不到的地方都会留下钩子,来插入自定义的实现,透明替换默认实现,

拦截器堆栈结构设计的非常强大,多种试图的解析,url mapping的多种实现,Locale resolver、Theme resolver 
、multipart file resolver,Excepiton hanlder Resolver等等,能让Spring MVC从1.0到3.0经历巨大变化, 
仍能向后兼容,并支持很酷的RESTful风格和强大的简化xml配置的注解。 
这些功能我们在项目中经常用到,但是Excepiton hanlder Resolver可能是个生僻一点的东东,因为我们通常对错误 
的处理通常不是非常的复杂,很多情况下只是根据异常或者http error code跳转到错误页面,这个是JSP/servlet就可
以搞定,在web.xml配置一下即可。

今天遇到一个事情,让我想用到HandlerExceptionResolver这个东东来处理异常。今天准备把自助系统进入上线状态, 
所以把log的级别从DEBUG调到INFO,结果没有catch的Runtime异常在log记录,后来跟踪了一下原来Spring把异常处理的log, 
直接使用的是debug,而不是error,所以log级别设置为INFO导致异常没有记录,看了一下spring的源代码:

Java代码  
  1. // Check registerer HandlerExceptionResolvers...
  2. ModelAndView exMv = null;
  3. for (Iterator it = this.handlerExceptionResolvers.iterator(); exMv == null && it.hasNext();) {
  4. HandlerExceptionResolver resolver = (HandlerExceptionResolver) it.next();
  5. exMv = resolver.resolveException(request, response, handler, ex);
  6. }
  7. if (exMv != null) {
  8. if (logger.isDebugEnabled()) {
  9. logger.debug("Handler execution resulted in exception - forwarding to resolved error view: " + exMv, ex);
  10. }
  11. WebUtils.exposeErrorRequestAttributes(request, ex, getServletName());
  12. return exMv;
  13. }

可以看到可以插入自己的HandlerExceptionResover来搞定这个问题,我们可以在resolveException方法任意处理异常和log。也可以 
把错误信息个性化后传到view层显示。 
我们只有简单的需求,就是把没有catch的异常记入log,将异常的完整信息放在错误页面的一个隐藏的区域,方便查找出现错误的原因。 
首先我们实现HandlerExceptionResolver

Java代码  
  1. package com.qunar.advertisement.exception;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.apache.log4j.Logger;
  7. import org.springframework.web.servlet.HandlerExceptionResolver;
  8. import org.springframework.web.servlet.ModelAndView;
  9. import com.qunar.advertisement.utils.StringPrintWriter;
  10. public class QADHandlerExceptionResolver implements HandlerExceptionResolver{
  11. private static Logger logger = Logger.getLogger(QADHandlerExceptionResolver.class);
  12. @Override
  13. public ModelAndView resolveException(HttpServletRequest request,
  14. HttpServletResponse response, Object handler, Exception ex) {
  15. logger.error("Catch Exception: ",ex);//把漏网的异常信息记入日志
  16. Map<String,Object> map = new HashMap<String,Object>();
  17. StringPrintWriter strintPrintWriter = new StringPrintWriter();
  18. ex.printStackTrace(strintPrintWriter);
  19. map.put("errorMsg", strintPrintWriter.getString());//将错误信息传递给view
  20. return new ModelAndView("error",map);
  21. }
  22. }

我们还需要一个辅助的类StringPrintWriter,因为ex.printStackTrace参数只有个PrintWriter类型的,java自带的StringWriter 
不可用,所以我们需要自己实现一个装饰器的StringPrintWriter。

Java代码  
  1. package com.qunar.advertisement.utils;
  2. import java.io.PrintWriter;
  3. import java.io.StringWriter;
  4. public class StringPrintWriter extends PrintWriter{
  5. public StringPrintWriter(){
  6. super(new StringWriter());
  7. }
  8. public StringPrintWriter(int initialSize) {
  9. super(new StringWriter(initialSize));
  10. }
  11. public String getString() {
  12. flush();
  13. return ((StringWriter) this.out).toString();
  14. }
  15. @Override
  16. public String toString() {
  17. return getString();
  18. }
  19. }

我们只需要在xml中配置一下就可以了:

Xml代码  
  1. <bean class="com.qunar.advertisement.exception.QADHandlerExceptionResolver">
  2. </bean>

我们在错误页面隐藏区域显示错误信息:

Html代码  
  1. <div style="display:none;">
  2. <c:out value="${errorMsg}"></c:out>
  3. </div>

使用Spring MVC HandlerExceptionResolver处理异常相关推荐

  1. spring MVC中定义异常页面

    如果我们在使用Spring MVC的过程中,想自定义异常页面的话,我们可以使用DispatcherServlet来指定异常页面,具体的做法很简单: 下面看我曾经的一个项目的spring配置文件: &l ...

  2. spring mvc中两种异常的处理手法

    spring mvc中两种异常的处理手法 在spring mvc中,对异常的处理,可以小结有如下两类写法: 1 <bean id="exceptionResolver" cl ...

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

    原文:http://blog.csdn.net/ufo2910628/article/details/40399539 1 描述  在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处 ...

  4. Spring MVC重定向和转发及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器. 对 ...

  5. Spring Boot Spring MVC异常处理原理分析

    一.Spring MVC为处理异常的前期准备 DispatcherServlet 入口类,是一个Servlet,是所有请求的分发点 初始化 DispatcherServlet在初始化时会触发onRef ...

  6. Spring Boot Spring MVC 异常处理的N种方法 1

    github:https://github.com/chanjarste... 参考文档: Spring Boot 1.5.4.RELEASE Documentation Spring framewo ...

  7. Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver

    Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver Spring MVC异常处理对于确保您不 ...

  8. Spring MVC异常统一处理(异常信息的国际化,日志记录)

    JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都 ...

  9. Spring MVC的异常处理器

    异常处理器 异常处理思路 Java 中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试等手段减少运行时异常的发生. ...

最新文章

  1. windows 如何安装oracle 补丁包,Windows Server 2003 上安装 Oracle10g(10.2.0.1)并升级 至补丁(10.2.0.4) 图解...
  2. R语言使用geompointdensity包的geom_pointdensity函数将散点图和密度图结合起来、使用viridis包的scale_color_virdis函数为密度数据添加调色板色彩渐变
  3. 我国机器视觉企业体量偏小,上游零部件占利润大头
  4. 旷视5号员工陈可卿:1991生于绍兴、10岁买电脑改变命运,信息奥赛金牌保送清华...
  5. iOS组件化(二):创建远程私有库
  6. DG备库磁盘空间满导致无法创建归档
  7. ai旋转扭曲_会了这些AI技巧:效率翻倍
  8. java 左右两边数据类型不一样_Java笔记-day004-[运算符]
  9. C++/CLI中的资源清理(Destructor,Finalizer)
  10. markdown grammar
  11. python的结构_Python结构的选择,python,之
  12. opencv学 之图像傅里叶变换dft
  13. idea解决maven pom依赖下载失败
  14. 面向对象进阶(day7)
  15. 如何在Linux中安装Intel核显驱动?
  16. 2021-1-31linux学习纪要
  17. 使用UIImageView实现加载GIF图片
  18. NGINX Sprint 年度线上会议:报名通道已开启,立即预定您的 NGINX 深潜之旅
  19. 【和76】龙头企业在区域市场中竞合关系分析样例(温微观察13-6)
  20. 英语四级词汇量测试软件,大学英语四级词汇量要求及自测卷

热门文章

  1. 父窗口控制弹出窗口快捷键ctrl+c关闭
  2. [MySQL Reference Manual] 7 备份和恢复
  3. C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
  4. Linux 基金会透露未来 Linux 内核可能会引入形式验证
  5. js判断是否包含指定字符串
  6. 手机游戏深化、改革。
  7. 汇编中的.section命令及汇编语言程序都至少声明的3个段
  8. 光驱弹不出来怎么办?光驱弹不出来的简易解决办法。
  9. pandas 调整显示的行数列数
  10. CSS------li中的宽和高无法修改问题