当前位置: 首页 > 编程日记 > 正文

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 = 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

相关文章:

1030 完美数列(two pointers解法)

1. 这道题出现在二分法&#xff0c;但是特殊之处在于&#xff0c;双指针是嵌套的&#xff0c;程序看上去有些像暴力枚举&#xff0c;但其实是利用了&#xff0c;如果i<j&#xff0c;a[i]*p>a[j]&#xff0c;那么一定有k在[i,j]范围内&#xff0c;a[i]*p>a[k]&#xff…

alsa声卡切换

环境 ubuntu12.04 因为桌面版的默认装了&#xff0c;而且调声音也很方便&#xff0c;这里说一下server版下的配置&#xff0c;毕竟做开发经常还是用server版的 1.安装 apt-get install alsa-base 它会把alsa-utils也一块装了&#xff0c;这是个工具包&#xff0c;如果没装的话 …

asp.net获取网站路径

网站在服务器磁盘上的物理路径: HttpRuntime.AppDomainAppPath 虚拟程序路径: HttpRuntime.AppDomainAppVirtualPath 任何于Request/HttpContext.Current等相关的方法, 都只能在有请求上下文或者页面时使用. 即在无请求上下文时,HttpContext.Current为null. 而上面提到的方法一…

iOS 绘制圆角

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

(C++)归并排序的递归与非递归实现

递归实现 merge函数利用的是双指针技巧降低复杂度。 mergeSort函数使用了递归&#xff0c;当中先对左右序列各调用一次mergeSort&#xff0c;再对整个序列调用merge。就按照最浅层的归并的思想去理解&#xff0c;不要大脑走到哪就step in。 另外mergeSort进入递归有个left&l…

SnackbarUtilDemo【Snackbar的封装类】

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

java通过代理访问网络

使用代理方式连接到网络 Testpublic void t13(){String charset "utf-8" ; String proxyHost "代理地址" ; int proxyPort 1234 ; //代理端口String proxyUrsername "登陆代理服务器的用户名" ; String proxyPassword "登陆代理服务器…

poj2503 Babelfish

跟poj3349很类似的题目&#xff0c;这题还稍简单。用qsort快速排序和二分查找可以很轻松AC。以下是代码&#xff1a; Run IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time5135234zen_chou2503Accepted2356K547MSC1212B2009-05-11 20:12:26Code1 #include <std…

(C语言)一种简易记法:生成[a,b]范围内的随机整数

1. 添加头文件 #include<stdlib.h> #include<time.h> 2. 初始化随机种子 srand((unsigned)time(NULL)); 3. 确定元素个数b-a1&#xff0c;以及最小元素 printf("%d",rand()%(b-a1)a);//生成[a,b]之间的数 printf("%d",rand()%1001);//生成…

IE和火狐都支持的方法(输入用户名和密码后按下 enter 键)

在Firefox中老报"event is not defined”错误&#xff01;原因是因为在Firefox中使用了不同的事件对象模型,不同于IE Dom&#xff0c;用的是W3C Dom。 document.οnkeydοwnfunction mykeyDown(e){ //compatible IE and firefox because there is not event in fir…

数据库中存储与读取文件

if exists (select * from dbo.sysobjects where id object_id(N[dbo].[p_binaryIO]) and OBJECTPROPERTY(id, NIsProcedure) 1)drop procedure [dbo].[p_binaryIO]GO /*--bcp 实现二进制文件的导入导出 支持image,text,ntext字段的导入/导出 image适合于二进制文件,包括:Wor…

洛谷P3723 [AH2017/HNOI2017]礼物(FFT)

传送门 首先&#xff0c;两个数同时增加自然数值相当于只有其中一个数增加&#xff08;此增加量可以小于0&#xff09; 我们令$x$为当前的增加量&#xff0c;${a},{b}$分别为旋转后的两个数列&#xff0c;那么$$ans\sum_{i1}^n(a_ix-b_i)^2$$ 然后把第$i$项提出来并展开&#x…

1035 插入与归并

1. 这一题&#xff0c;首先要会插入排序和归并排序的写法。对于归并排序&#xff0c;可以用非递归sort最简便。把每一趟的结果存进二维数组。 2. 单独封装一个函数&#xff0c;比较两个一维数组是否完全一样。 3. 由于归并比插入的复杂度低&#xff0c;趟数少&#xff0c;所以…

代码设置LinearLayout的高度

问题描述我想把这个LinearLayout宽度设置成为FILL_PARENT&#xff0c;源码如下LinearLayout checkboxLinearLayout (LinearLayout) getLayoutInflater().inflate(R.layout.checkboxdoitem, null);LayoutParams params (LayoutParams) checkboxLinearLayout.getLayoutParams();…

精通Spring Boot —— 第十五篇:使用@ControllerAdvice处理异常

在Spring 3.2中&#xff0c;新增了ControllerAdvice、RestControllerAdvice 注解&#xff0c;可以用于定义ExceptionHandler、InitBinder、ModelAttribute&#xff0c;并应用到所有RequestMapping、PostMapping&#xff0c; GetMapping注解中。接下来我将通过代码展示如何使用这…

架构设计之分布式文件系统

1&#xff1a;类图 2&#xff1a;数据结构 create table TBCOFILE ( FILEID INTEGER not null, FILETIME DATE, TYPE VARCHAR2(10), USERID INTEGER, IP VARCHAR2(20), APPTYPE INTEGER default 0) 3&#xff1a;开发步骤 1&#xff1a;从数据库申…

1029 Median

1. 开始测试点3和6答案错误&#xff0c;原因是没有考虑到&#xff0c;给的两个数列有可能长度相差很大&#xff0c;某个数列还没到中位数&#xff0c;就结束了。 2. 这题的底子是用two pointers按照非递减的顺序合并两个数列&#xff0c;无非是再确定一下中间那个数的下标&…

理解系统底层的概念是多么重要

理解系统底层的概念是多么重要 ——趋势科技邹飞评《程序员的自我修养》 关于《程序员的自我修养》这本书&#xff0c;最初是在和博文的周筠老师MSN上谈起&#xff0c;当时听周老师提及这本书是一本关于链接和装载等系统软件知识的书籍&#xff0c;当时就很感兴趣&#xff0c;因…

session删除

删除一个session值&#xff1a; session_unset(变量); session_destroy(变量); 删除一个cookie&#xff1a; 注意第二个参数中手册中的说明是&#xff1a; Cookie 必须用和设定时的同样的参数才能删除。如果其值一个空字符串&#xff0c;或者是 FALSE&#xff0c;并且其它的参数…

Android学习路线

Android学习路线 第一阶段&#xff1a;Java面向对象编程 1.Java基本数据类型与表达式&#xff0c;分支循环。 2.String和StringBuffer的使用、正则表达式。 3.面向对象的抽象&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff0c;类与对象&#xff0c;对象初始化和回…

1048 Find Coins(two pointers解法)

1. 很典型的双指针的应用&#xff0c;将数组按照非降排列&#xff0c;两个指针从一头一尾开始包抄&#xff0c;若等于&#xff08;等于要放在第一个&#xff09;则返回结果结束程序&#xff0c;小于则左指针右移&#xff0c;大于则右指针左移。 2. 起初还担心&#xff0c;如果…

TCP/IP 协议理解

TCP/IP 协议&#xff08;Transmission Control Protocol / internet Protocol&#xff09;&#xff0c;因特网互联协议&#xff0c;又名网络通讯协议。通俗而言&#xff1a;TCP负责发现传输的问题&#xff0c;一有问题就发出信号&#xff0c;要求重新传输&#xff0c;直到所有数…

Webhint开源了一种代码检查工具

Webhint项目提供了一种用于检查代码的可访问性、性能和安全的开源检查&#xff08;Linting&#xff09;工具。在创建Web站点和应用中&#xff0c;有越来越多的细节问题亟待完善。为此&#xff0c;Webhint力图帮助开发人员标记这些细节。\\Webhint以命令行接口&#xff08;CLI&a…

SHAREPOINT爬网设置

F:\2009年\MOSS档案 http://share:30088/default.aspx 进入管理中心 共享服务管理-SharedServices1-搜索设置-内容源和爬网计划-本地 Office SharePoint Server 网站-下拉- -编辑-爬网计划-完全(增量)爬网-创建计划 - 对该内容源启动完全爬网-勾选上。 一、 爬网设置&#xff…

1093 Count PAT‘s

这题出现在“活用递推”专题下面&#xff0c;所谓递推就是这一步的结果和上一步的结果有直接联系。对于本题来说&#xff0c;从左到右&#xff0c;记到当前位置&#xff0c;一共出现的P的个数&#xff0c;如果当前位置是P&#xff0c;则个数就是上一位的加1&#xff0c;否则等于…

拜托,面试别再问我时间复杂度了!!!

最烦面试官问&#xff0c;“为什么XX算法的时间复杂度是OO”&#xff0c;今后&#xff0c;不再惧怕这类问题。 快速排序分为这么几步&#xff1a; 第一步&#xff0c;先做一次partition&#xff1b; partition使用第一个元素tarr[low]为哨兵&#xff0c;把数组分成了两个半区&a…

C#和JavaScript的简单互交

转自&#xff1a;http://cgxcn.blog.163.com/blog/static/132312422009426112558831/ 1.asp.net呼叫js Response.Write("<script languagejavascript>"); Response.Write("alert(登峰欢迎您 );" ); …

读阮一峰对《javascript语言精粹》的笔记,我有疑问。

《javascript语言精粹》是一本很棒的书籍&#xff0c;其中作者在附录列出了12种他所认为的javascript语言中的糟粕。 我最近开始跟读前端前辈的博客&#xff0c;其中读到了阮一峰的《12种不宜使用的Javascript语法》&#xff0c;有一个疑问&#xff1a; 文如下&#xff1a; 9. …

1008 Elevator

思路如下&#xff1a;用一个整型数组存楼层&#xff0c;0号元素为0(开始停在0层)&#xff0c;每读入一个元素&#xff0c;和上一个比较&#xff0c;更大说明是上升&#xff0c;总时长加上楼层差*6&#xff0c;反之说明是下降&#xff0c;总时长加上楼层差*4。最后再管停留时间&…

软件安全性能測试(转载)

近来&#xff0c;在我负责的公司某软件产品的最后測试工作&#xff0c;经常被问到这样一个问题&#xff1a;在做測试过程中&#xff0c;我们的软件产品在安全性方面考虑了多少&#xff1f;应该怎样測评一个软件究竟有多安全&#xff1f; 这个软件因为涉及客户商业上重要的…