转载出处: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. Golang1.13.x 解决go get 无法下载问题
  2. vs2012创建Windows服务
  3. 下坠的小鸟(flappy bird)速算版
  4. oracle 10g 更换ocr,Oracle10g RAC在线更换OCR votedisk
  5. 文件共享服务器第二部,第二章-构建Samba文件共享服务器.docx
  6. Linux 命令之 unset -- 删除指定的shell变量或函数
  7. 一个轻量级javascript框架的设计模式
  8. Linux下切换用户根目录的指令
  9. Helm 3 完整教程(三):chart 的文件结构和字段详解
  10. idea的文件可以mysql运行吗,终于将tiny-sdpm+intellij idea+mysql+jettyt运行成功
  11. 图像增强总结-Retinex算法
  12. 将Table转换成HTML
  13. PDF模板查找关键字坐标
  14. python俄罗斯方块代码34行_轻松一下,500 行代码写一个俄罗斯方块游戏玩玩
  15. 胆固醇PEG胆固醇,CLS-PEG-CLS
  16. 过于自信,面试普通Java岗被面试官吊打了。。。
  17. 快速排序详细分析--单向扫描和双向扫描
  18. git merge 冲突解决
  19. 2032:【例4.18】分解质因数
  20. EasyGBS对接宇视SDK,多次点击录像回放出现崩溃是什么原因?

热门文章

  1. 刘光毅:频谱统一推进5G尽早商用 4G网络向5G平滑演进
  2. Windows IIS7 下安装配置 PHP7.0
  3. 迪普科技:G20峰会背后的网络安全守护者
  4. 如何查看oracle 查版本号
  5. Java IO学习笔记四
  6. spring获取bean的方案
  7. 32位系统和64位系统的辨别
  8. pollepoll实现分析(二)——epoll实现
  9. Python 学习笔记 - 字典
  10. 解密SSL流量,发现隐藏威胁