springMVC自定义全局异常

news/2024/7/7 23:41:47

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 = 0;while(tmp.getCause()!=null){if(tmp.equals(tmp.getCause())){break;}tmp=tmp.getCause();breakPoint++;if(breakPoint>1000){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">500</prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 --><prop key="null">503</prop></props></property><property name="defaultStatusCode" value="404"/><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 --></bean>

 

转载于:https://www.cnblogs.com/Eeexiang/p/9725008.html


http://lihuaxi.xjx100.cn/news/236151.html

相关文章

Python之机器学习K-means算法实现

一、前言&#xff1a; 今天在宿舍弄了一个下午的代码&#xff0c;总算还好&#xff0c;把这个东西算是熟悉了&#xff0c;还不算是力竭&#xff0c;只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行&#xff0c;运行的Python环境是Python3.6以上的版本&#…

Win7下用VS2010编译QGIS2.9.0

折腾了两天了&#xff0c;终于吧QGIS2.9.0在VS2010下面编译过了。 参考了许多的博客&#xff0c;在网络环境极为和&#xff08;e&#xff09;谐&#xff08;lie&#xff09;的情况下用Google查了好多资料。 其实原创的东西真的不多&#xff0c;但是毕竟是自己亲身实践得到的成…

iOS 绘制圆角

级别&#xff1a; ★☆☆☆☆ 标签&#xff1a;「iOS切圆角」「layer圆角」「CAShapeLayer圆角」 作者&#xff1a; XsH 审校&#xff1a; QiShare团队 项目中会常有圆角&#xff08;或圆形&#xff09;显示视图的需求&#xff08;比如用户头像的显示&#xff09;&#xff0c;也…

php面试问答

结合实际PHP面试&#xff0c;汇总自己遇到的问题&#xff0c;以及网上其他人遇到的问题&#xff0c;尝试提供简洁准确的答案包含MySQL、Redis、Web、安全、网络协议、PHP、服务器、业务设计、线上故障、个人简历、自我介绍、离职原因、职业规划、准备问题等部分 GitHub: https:…

WinXp安装Oracle 11g Express Edition

由于在虚拟机上学习&#xff08;怕把真机器搞坏了&#xff09;&#xff0c;这次是在Windows XP上安装Oracle 11g Express。 本文安装的是Oracle 11g Express&#xff0c;是Oracle数据库的快速版&#xff08;学习版&#xff09;&#xff0c;安装包大小只有几百MB。 到Oracle的…

SnackbarUtilDemo【Snackbar的封装类】

版权声明&#xff1a;本文为HaiyuKing原创文章&#xff0c;转载请注明出处&#xff01; 前言 这个工具类参考的是《没时间解释了&#xff0c;快使用Snackbar!——Android Snackbar花式使用指南》&#xff0c;代码几乎一样&#xff0c;所以想要了解具体原理或者更详细信息请阅读…

跨域的四种方式

本文主要是关于跨域的几种方式&#xff0c;关于什么是跨域这里就不多说了&#xff0c;写这个也是为了记住一些知识点的。 一. jsonp jsonp的跨域方式很容易理解&#xff0c;页面的的每一个script标签浏览器都会发送get请求获取对应的文本资源&#xff0c;获取到了之后&#xff…

使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置

最近的项目要求写一个读写pcap文件的小程序&#xff0c;用来修改pcap中的部分信息&#xff0c;实现pcap的定制。 所以必须学会使用wireshark并能有利用WinPcap库和libpcap库进行开发。 虽然本文记录的都是windows下使用WinPcap进行开发&#xff0c;但是由于希望程序能够跨平台…