springMVC自定义全局异常
SpringMVC通过HandlerExceptionResolver处理程序异常,包括Handler映射,数据绑定以及目标方法执行时所发生的异常。
SpringMVC中默认是没有加装载HandlerExceptionResolver,我们需要在SpringMVC.xml中配置
<mvc:annotation-driven />
1、可以在Controller里面定义一个局部的异常处理方法(只处理该Controller下的异常)
/**
* 在这个方法中可以加入Exception类型的参数,该参数即对于发生的异常对象
* 入参中不能传入map,若希望把异常信息传到页面上需要使用ModelAndView作为返回值
*/
@ExceptionHandler({NullPointerException.class})
public String handlerNullPointerException(Exception ex){
System.out.println("异常 : " + ex);
return "error";
}
该方法只会对该controller中的NullPointException异常捕获,若是想返回一个错误的提示页面,添加一个ModelAndView返回就好了
2、全局异常处理
①:自定义异常处理类需要实现HandlerExceptionResolver接口,然后再application.xml文件中注册这个bean
@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {
/**
* 对异常信息进行统一处理,区分异步和同步请求,分别处理
*/
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
boolean isajax = isAjax(request,response);
Throwable deepestException = deepestException(ex);
return processException(request, response, handler, deepestException, isajax);
}
/**
* 判断当前请求是否为异步请求.
*/
private boolean isAjax(HttpServletRequest request, HttpServletResponse response){
return oConvertUtils.isNotEmpty(request.getHeader("X-Requested-With"));
}
}
/**
* 获取最原始的异常出处,即最初抛出异常的地方
*/
private Throwable deepestException(Throwable e){
Throwable tmp = e;
int breakPoint = ;
while(tmp.getCause()!=null){
if(tmp.equals(tmp.getCause())){
break;
}
tmp=tmp.getCause();
breakPoint++;
if(breakPoint>){
break;
}
}
return tmp;
}
/**
* 处理异常.
* @param request
* @param response
* @param handler
* @param deepestException
* @param isajax
* @return
*/
private ModelAndView processException(HttpServletRequest request,
HttpServletResponse response, Object handler,
Throwable ex, boolean isajax) {
//步骤一、异常信息记录到日志文件中.
log.error("全局处理异常捕获:", ex);
//步骤二、异常信息记录截取前50字符写入数据库中.
logDb(ex);
//步骤三、分普通请求和ajax请求分别处理.
if(isajax){
return processAjax(request,response,handler,ex);
}else{
return processNotAjax(request,response,handler,ex);
}
}
private ModelAndView processAjax(HttpServletRequest request,
HttpServletResponse response, Object handler,
Throwable deepestException){
ModelAndView empty = new ModelAndView();
//response.setContentType("application/json");
response.setHeader("Cache-Control", "no-store");
AjaxJson json = new AjaxJson();
json.setSuccess(true);
json.setMsg(deepestException.getMessage());
PrintWriter pw = null;
try {
pw=response.getWriter();
pw.write(JSONHelper.bean2json(json));
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
pw.close();
}
empty.clear();
return empty;
}
private ModelAndView processNotAjax(HttpServletRequest request,
HttpServletResponse response, Object handler, Throwable ex) {
String exceptionMessage = getThrowableMessage(ex);
Map<String, Object> model = new HashMap<String, Object>();
model.put("exceptionMessage", exceptionMessage);
model.put("ex", ex);
return new ModelAndView("common/error", model);
}
}
②:注解@ControllerAdvice和@ExceptionHandler配合完成全局的异常捕获和处理返回
/**
* @author SimpleWu
* @ControllerAdvice:如果在当前Handler找不到当前方法出现的异常则将来这个注解标记的类中查找处理异常。
* 意为定义一个全局异常
*/
@ControllerAdvice
public class UserException { @ExceptionHandler({NullPointerException.class})
public ModelAndView handlerNullPointerException(Exception ex){
System.out.println("[异常] : " + ex);
ModelAndView mav = new ModelAndView("error");
mav.addObject("exception",ex);
return mav;
}
}
3、另外spring已经提供SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver
Spring除了实现了一个DefaultHandlerExceptionResolver之外,还实现了一个SimpleMappingExceptionResolver,这两者都是继承自抽象类AbstractHandlerExceptionResolver,而AbstractHandlerExceptionResolver是实现了HandlerExceptionResolver接口的resolveException方法的,并由此抽取出两个抽象方法,一个是在进行异常处理之前执行的方法prepareResponse(exception, response),一个是进行异常解析的doResolveException(request, response, handler, exception)方法。SimpleMappingExceptionResolver,顾名思义就是通过简单的映射关系来决定由哪个视图来处理当前的错误信息。SimpleMappingExceptionResolver提供了通过异常类型exceptionMappings来进行异常与视图之间的映射关系,提供了在发生异常时通过statusCodes来映射异常返回的视图名称和对应的HttpServletResponse的返回码。而且可以通过defaultErrorView和defaultErrorCode来指定默认值,defaultErrorView表示当没有在exceptionMappings里面找到对应的异常类型时就返回defaultErrorView定义的视图,defaultErrorCode表示在发生异常时当没有在视图与返回码的映射关系statusCodes里面找到对应的映射时默认返回的返回码。在使用SimpleMappingExceptionResolver时,当发生异常的时候,SimpleMappingExceptionResolver将会把当前的异常对象放到自身属性exceptionAttribute中,当没有指定exceptionAttribute时,exceptionAttribute就是用默认值exception。
以下是一个简单的例子:详情点击https://www.cnblogs.com/sunhaoyu/articles/5307496.html
(1)SpringMVC的servlet配置文件中申明一个SimpleMappingExceptionResolver bean,并通过配置属性exceptionMappings和defaultExceptionView来指定异常和视图的对应关系。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="NumberFormatException">number</prop><!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 -->
<prop key="NullPointerException">null</prop>
</props>
</property>
<property name="defaultErrorView" value="exception"/><!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图-->
<property name="statusCodes"><!-- 定义在发生异常时视图跟返回码的对应关系 -->
<props>
<prop key="number"></prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 -->
<prop key="null"></prop>
</props>
</property>
<property name="defaultStatusCode" value=""/><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 -->
</bean>
springMVC自定义全局异常的更多相关文章
- 关于SpringMVC的全局异常处理器
近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestM ...
- 基于SpringMVC的全局异常处理器介绍(转)
近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestM ...
- SpringMVC实现全局异常处理器 (转)
出处: SpringMVC实现全局异常处理器 我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手 ...
- 13.SpringMVC之全局异常
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层 ...
- @Valid 数据校验 + 自定义全局异常信息
关于javax.validation.Validator校验的使用 对于要校验的实体类:其需要校验的字段上需要添加注解 实际例子 使用:首先要拿到 validator的子类 Validator val ...
- Yii自定义全局异常,接管系统异常
Yii自定义全局异常,接管系统异常 一般自己的框架都会使用一些自己封装的全局异常,那么在系统发生异常突发情况时候,即可自主的做一些异常机制处理,例如发送短信.发送邮件通知系统维护人员或者以更加友好的方 ...
- springMVC的全局异常设置
先说为什么要设置全局异常.比如说,你程序出错了,500错误,大家都知道,程序出错就不会往下面执行,但是客户端那边还是一直等待状态,所以,我们后台无论正常还是报错都要给客户端返回数据.当然,我们可以tr ...
- WebApi自定义全局异常过滤器及返回数据格式化
WebApi在这里就不多说了,一种轻量级的服务,应用非常广泛.我这这里主要记录下有关 WebApi的相关知识,以便日后使用. 当WebApi应用程序出现异常时,我们都会使用到异常过滤器进行日志记录,并 ...
- SpringMVC 自定义全局PropertyEditor
<mvc:annotation-driven></mvc:annotation-driven>注入了@Controller与@RequestMapping需要的注解类 < ...
随机推荐
- Linux 测试常用命令
ls :列出文件 ls -l ls -t 按时间排序 ls -rt 按时间倒序 ls -a 列出所有文件(包括隐藏的) ll : ll = ‘ls -l ’ cd: 进入文件目录 cd 不带目录名 ...
- (32)forms组件(数据校验)
forms组件的用处 1.就是用来做数据校验的 2.渲染页面 3.渲染错误信息(和局部刷新同效果) 数据校验 要使用forms组件必须要写一个类继承forms组件 urls.py from bbs01 ...
- Actifio CDS 2TB MDisk limits
**** updated 7 Aug 2016 - reformatted and corrected out of date info *** Background Depending on you ...
- Linux scp命令详解
Linux scp命令 Linux scp命令用于Linux之间复制文件和目录. scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 语法: ...
- Mycat 镜像-创建 Docker 镜像
将 Mycat-server 创建到镜像,使其能够进行容器化部署,我们需要创建 Dockerfile 并在文件中安装其依赖项,使用 centos 做为 base 镜像,并安装 jdk 依赖即可,因此创 ...
- ios-微信支付登录分享-notification通知
// // AppDelegate.m // NewAppBase // // Created by ENERGY on 2018/5/17. // Copyright © 2018年 ENE ...
- <realsense D400>同步采集深度图和彩色图
利用深度相机采集深度图和彩色图会面临一个问题,如何实现同步采集数据? 以下是我搜集到的两点方法: 1)高翔博士提到他的orbslam2教程有这么一步工作,具体目录为 example/RGBD/. (等 ...
- MySQL 批量添加
自己封装的一个批量添加. $data 是一个二维数组.key对应是数据表的字段名: /** * 批量创建 * @param array $data * @return int $res 影响行 * @ ...
- Zookeeper集群节点数量为什么要是奇数个?
无论是公司的生产环境,还是自己搭建的测试环境,Zookeeper集群的节点个数都是奇数个.至于为什么要是奇数个,以前只是模糊的知道是为了满足选举需要,并不知道详细的原因.最近重点学习zookeeper ...
- 初识docker-镜像
前言: 以前学习docker 都是零零碎碎的,只知道用,有些莫名其妙的报错自己也没有思路去解决,所以基于一本专业的介绍docker的书籍,重新开启学习,该博客就记录下我自己的学习过程吧. 1.dock ...