Java springmvc 统一异常处理的方案
前言:为什么要统一异常处理?经常在项目中需要统一处理异常,将异常封装转给前端。也有时需要在项目中统一处理异常后,记录异常日志,做一下统一处理。
Springmvc 异常统一处理的方式有三种。
一、使用 @ExceptionHandler 注解
这种方式比较独立,如果 ctrl 层的异常处理只有自己这个 ctrl 层会这样处理,就可以采用这种方式,因为这个注解的方法必须和 ctrl 层需要处理异常的方法在同一个 controller 里。
@Controller
@RequestMapping("/demoCtrl")
public class DemoCtrl { @RequestMapping("/testException")
public String testException() {
throw new RuntimeException();
} @ExceptionHandler(RuntimeException.class)
public void dealException(){
System.out.println("hei, throw new Exception");
}
}
二、使用 @ControllerAdvice+ @ ExceptionHandler 注解(全局)
有了 @ControllerAdvice 就不需要限制在同一个 controller 中了。这种方式适合通用的 ctrl 层异常处理,可以实现全局的 ctrl 层异常捕获处理。
经测试,如果方法一和方法二的处理异常同时存在且异常类型一直,则会进入方法一的异常。
新建一个统一处理异常的类即可。请确保此WebExceptionHandle 类能被扫描到并装载进 Spring 容器中。
@ControllerAdvice
public class WebExceptionHandle {
@ExceptionHandler(RuntimeException.class)
public void dealException(){
System.out.println("hei, throw new Exception");
}
}
参考文章:https://www.cnblogs.com/junzi2099/p/7840294.html、https://www.cnblogs.com/shuimuzhushui/p/6791600.html
三、实现 HandlerExceptionResolver 接口(全局)
HandlerExceptionResolver接口中定义了一个resolveException方法,用于处理Controller中的异常。Exception ex参数即Controller抛出的异常。返回值类型是ModelAndView,可以通过这个返回值来设置异常时显示的页面。
写一个统一处理异常的类,实现 HandlerExceptionResolver 接口即可。
最后,当然需要将自己的HandlerExceptionResolver实现类配置到Spring配置文件中,或者加上@Component注解。
@Component
public class ExtHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
// 视图显示专门的错误页
ModelAndView modelAndView = new ModelAndView("yule/demo/demoScroll");
return modelAndView;
}
}
相关问题
HandlerExceptionResolver和web.xml中配置的error-page会有冲突吗?
web.xml中配置error-page同样是配置出现错误时显示的页面:
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
如果resolveException返回了ModelAndView,会优先根据返回值中的页面来显示。不过,resolveException可以返回null,此时则展示web.xml中的error-page的500状态码配置的页面。
当web.xml中有相应的error-page配置,则可以在实现resolveException方法时返回null。
API文档中对返回值的解释:
return a corresponding ModelAndView to forward to, or null for default processing.
参考文章:https://blog.csdn.net/mym43210/article/details/78530565
Java springmvc 统一异常处理的方案的更多相关文章
- [原创]Java项目统一UTC时间方案
Java项目统一UTC时间方案 作者:Gods_巨蚁 引言 近期团队的个别项目在进行框架升级后,部分时间值存在8小时误差,原因是错误的将数据库中的时间数据理解成了UTC时间(旧版本认为是北京时间) 考 ...
- springMVC统一异常处理
Spring MVC处理异常有3种方式: 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver: 实现Spring的异常处理接口HandlerExc ...
- SpringMVC学习笔记七:SpringMVC统一异常处理
发现有位前辈写得比我从书上看到的还详细,我就不写了,前辈的博文地址如下: http://blog.csdn.net/eson_15/article/details/51731567
- Java生鲜电商平台-统一异常处理及架构实战
Java生鲜电商平台-统一异常处理及架构实战 补充说明:本文讲得比较细,所以篇幅较长. 请认真读完,希望读完后能对统一异常处理有一个清晰的认识. 背景 软件开发过程中,不可避免的是需要处理各种异常,就 ...
- SpringMVC框架08——统一异常处理
前言 在Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的.不可预知的异常需要处理.如果每个过程都单独处理异常,那么系统的代码耦合度高, ...
- js构建ui的统一异常处理方案(四)
上一篇我们介绍了统一异常处理方案的设计方案,这一篇我们将直接做一个小例子,验证我们的设计方案. 例子是一个todo的列表界面(页面代码参考于https://github.com/zongxiao/Dj ...
- js构建ui的统一异常处理方案(三)
笔者之前分析了如何实现js的责任链异常处理的方法,通过promise这个异步模型,我们能够对同步方法和异步方法的两种情况,均可以实现责任链模式.有了这些武器,我们就可以开始设计ui的统一异常处理方案了 ...
- 【SpringMVC学习07】SpringMVC中的统一异常处理
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层 ...
- SpringMVC 控制器统一异常处理
摘要介绍spring mvc控制器中统一处理异常的两种方式:HandlerExceptionResolver以及@ExceptionHandler:以及使用@ControllerAdvice将@Exc ...
随机推荐
- Memoization-329. Longest Increasing Path in a Matrix
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- 什么是Ajax?Ajax的原理是什么?Ajax的核心技术是什么?Ajax的优缺点是什么?
Ajax是一种无需重新加载整个网页,能够更新部分网页的技术.Asynchronous JavaScript and XML的缩写,是JavaScript.XML.CSS.DOM等多个技术的组合. Aj ...
- webstrom 一直反复indexing
从网上找了找答案 好多说 把大的静态文件exclude(在项目文件上右击-->Mark Directory As -->exclude)出去,可是不管用.我刚发生的情况是一直刷新,一遍一遍 ...
- 找到SVN版本机上项目的地址
在你的项目文件上右击:点击Copy URL to Clipboard(复制URL到剪切板)
- Android访问网络,使用HttpURLConnection还是HttpClient?
本文转自:http://blog.csdn.net/guolin_blog/article/details/12452307,感谢这位网友的分享,谢谢. 最近在研究Volley框架的源码,发现它在HT ...
- iOS 获取设备的各种信息的方法
一.目录结构: 获取屏幕宽度与高度 获取设备版本号 获取iPhone名称 获取app版本号 获取电池电量 获取当前系统名称 获取当前系统版本号 获取通用的唯一识别码UUID 获取当前设备IP 获取总内 ...
- Linux CentOS7系统探索
这两天,突发奇想,想着用着微软家的windows系统很多年了,也想尝试一下其他的操作系统.很快的就想到了Linux操作系统,它不是面向用户的,而是面向服务器的,在服务器端的市场中占了很大的市场份额,备 ...
- 【转载】 C#中数组、ArrayList和List三者的区别
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到 ...
- Java之IO(七)ObjectInputStream和ObjectOutputStream
转载请注明源出处:http://www.cnblogs.com/lighten/p/7003536.html 1.前言 本章介绍Java字节流中重要的成员,对象流ObjectInputStream和O ...
- [转载]7款开源ERP系统比较
现在有许多企业将ERP项目,在企 业中没有实施好,都归咎于软件产品不好.其实,这只是你们的借口.若想要将ERP软件真正与企业融合一体,首先得考虑企业的自身情况,再去选择适合的 ERP软件. 如果你的企 ...