使用Spring MVC HandlerExceptionResolver处理异常
转载出处: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的源代码:
![](http://fuliang.iteye.com/images/icon_star.png)
- // Check registerer HandlerExceptionResolvers...
- ModelAndView exMv = null;
- for (Iterator it = this.handlerExceptionResolvers.iterator(); exMv == null && it.hasNext();) {
- HandlerExceptionResolver resolver = (HandlerExceptionResolver) it.next();
- exMv = resolver.resolveException(request, response, handler, ex);
- }
- if (exMv != null) {
- if (logger.isDebugEnabled()) {
- logger.debug("Handler execution resulted in exception - forwarding to resolved error view: " + exMv, ex);
- }
- WebUtils.exposeErrorRequestAttributes(request, ex, getServletName());
- return exMv;
- }
可以看到可以插入自己的HandlerExceptionResover来搞定这个问题,我们可以在resolveException方法任意处理异常和log。也可以
把错误信息个性化后传到view层显示。
我们只有简单的需求,就是把没有catch的异常记入log,将异常的完整信息放在错误页面的一个隐藏的区域,方便查找出现错误的原因。
首先我们实现HandlerExceptionResolver
![](http://fuliang.iteye.com/images/icon_star.png)
- package com.qunar.advertisement.exception;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.log4j.Logger;
- import org.springframework.web.servlet.HandlerExceptionResolver;
- import org.springframework.web.servlet.ModelAndView;
- import com.qunar.advertisement.utils.StringPrintWriter;
- public class QADHandlerExceptionResolver implements HandlerExceptionResolver{
- private static Logger logger = Logger.getLogger(QADHandlerExceptionResolver.class);
- @Override
- public ModelAndView resolveException(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex) {
- logger.error("Catch Exception: ",ex);//把漏网的异常信息记入日志
- Map<String,Object> map = new HashMap<String,Object>();
- StringPrintWriter strintPrintWriter = new StringPrintWriter();
- ex.printStackTrace(strintPrintWriter);
- map.put("errorMsg", strintPrintWriter.getString());//将错误信息传递给view
- return new ModelAndView("error",map);
- }
- }
我们还需要一个辅助的类StringPrintWriter,因为ex.printStackTrace参数只有个PrintWriter类型的,java自带的StringWriter
不可用,所以我们需要自己实现一个装饰器的StringPrintWriter。
![](http://fuliang.iteye.com/images/icon_star.png)
- package com.qunar.advertisement.utils;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- public class StringPrintWriter extends PrintWriter{
- public StringPrintWriter(){
- super(new StringWriter());
- }
- public StringPrintWriter(int initialSize) {
- super(new StringWriter(initialSize));
- }
- public String getString() {
- flush();
- return ((StringWriter) this.out).toString();
- }
- @Override
- public String toString() {
- return getString();
- }
- }
我们只需要在xml中配置一下就可以了:
![](http://fuliang.iteye.com/images/icon_star.png)
- <bean class="com.qunar.advertisement.exception.QADHandlerExceptionResolver">
- </bean>
我们在错误页面隐藏区域显示错误信息:
![](http://fuliang.iteye.com/images/icon_star.png)
- <div style="display:none;">
- <c:out value="${errorMsg}"></c:out>
- </div>
使用Spring MVC HandlerExceptionResolver处理异常相关推荐
- spring MVC中定义异常页面
如果我们在使用Spring MVC的过程中,想自定义异常页面的话,我们可以使用DispatcherServlet来指定异常页面,具体的做法很简单: 下面看我曾经的一个项目的spring配置文件: &l ...
- spring mvc中两种异常的处理手法
spring mvc中两种异常的处理手法 在spring mvc中,对异常的处理,可以小结有如下两类写法: 1 <bean id="exceptionResolver" cl ...
- 使用Spring MVC统一异常处理实战
原文:http://blog.csdn.net/ufo2910628/article/details/40399539 1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处 ...
- Spring MVC重定向和转发及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器. 对 ...
- Spring Boot Spring MVC异常处理原理分析
一.Spring MVC为处理异常的前期准备 DispatcherServlet 入口类,是一个Servlet,是所有请求的分发点 初始化 DispatcherServlet在初始化时会触发onRef ...
- Spring Boot Spring MVC 异常处理的N种方法 1
github:https://github.com/chanjarste... 参考文档: Spring Boot 1.5.4.RELEASE Documentation Spring framewo ...
- Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver
Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver Spring MVC异常处理对于确保您不 ...
- Spring MVC异常统一处理(异常信息的国际化,日志记录)
JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都 ...
- Spring MVC的异常处理器
异常处理器 异常处理思路 Java 中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试等手段减少运行时异常的发生. ...
最新文章
- Golang1.13.x 解决go get 无法下载问题
- vs2012创建Windows服务
- 下坠的小鸟(flappy bird)速算版
- oracle 10g 更换ocr,Oracle10g RAC在线更换OCR votedisk
- 文件共享服务器第二部,第二章-构建Samba文件共享服务器.docx
- Linux 命令之 unset -- 删除指定的shell变量或函数
- 一个轻量级javascript框架的设计模式
- Linux下切换用户根目录的指令
- Helm 3 完整教程(三):chart 的文件结构和字段详解
- idea的文件可以mysql运行吗,终于将tiny-sdpm+intellij idea+mysql+jettyt运行成功
- 图像增强总结-Retinex算法
- 将Table转换成HTML
- PDF模板查找关键字坐标
- python俄罗斯方块代码34行_轻松一下,500 行代码写一个俄罗斯方块游戏玩玩
- 胆固醇PEG胆固醇,CLS-PEG-CLS
- 过于自信,面试普通Java岗被面试官吊打了。。。
- 快速排序详细分析--单向扫描和双向扫描
- git merge 冲突解决
- 2032:【例4.18】分解质因数
- EasyGBS对接宇视SDK,多次点击录像回放出现崩溃是什么原因?