使用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的源代码:
- // 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
- 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。
- 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中配置一下就可以了:
- <bean class="com.qunar.advertisement.exception.QADHandlerExceptionResolver">
- </bean>
我们在错误页面隐藏区域显示错误信息:
- <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,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试等手段减少运行时异常的发生. ...
最新文章
- windows 如何安装oracle 补丁包,Windows Server 2003 上安装 Oracle10g(10.2.0.1)并升级 至补丁(10.2.0.4) 图解...
- R语言使用geompointdensity包的geom_pointdensity函数将散点图和密度图结合起来、使用viridis包的scale_color_virdis函数为密度数据添加调色板色彩渐变
- 我国机器视觉企业体量偏小,上游零部件占利润大头
- 旷视5号员工陈可卿:1991生于绍兴、10岁买电脑改变命运,信息奥赛金牌保送清华...
- iOS组件化(二):创建远程私有库
- DG备库磁盘空间满导致无法创建归档
- ai旋转扭曲_会了这些AI技巧:效率翻倍
- java 左右两边数据类型不一样_Java笔记-day004-[运算符]
- C++/CLI中的资源清理(Destructor,Finalizer)
- markdown grammar
- python的结构_Python结构的选择,python,之
- opencv学 之图像傅里叶变换dft
- idea解决maven pom依赖下载失败
- 面向对象进阶(day7)
- 如何在Linux中安装Intel核显驱动?
- 2021-1-31linux学习纪要
- 使用UIImageView实现加载GIF图片
- NGINX Sprint 年度线上会议:报名通道已开启,立即预定您的 NGINX 深潜之旅
- 【和76】龙头企业在区域市场中竞合关系分析样例(温微观察13-6)
- 英语四级词汇量测试软件,大学英语四级词汇量要求及自测卷
热门文章
- 父窗口控制弹出窗口快捷键ctrl+c关闭
- [MySQL Reference Manual] 7 备份和恢复
- C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
- Linux 基金会透露未来 Linux 内核可能会引入形式验证
- js判断是否包含指定字符串
- 手机游戏深化、改革。
- 汇编中的.section命令及汇编语言程序都至少声明的3个段
- 光驱弹不出来怎么办?光驱弹不出来的简易解决办法。
- pandas 调整显示的行数列数
- CSS------li中的宽和高无法修改问题