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 ...
随机推荐
- 点分治&&动态点分治学习笔记
突然发现网上关于点分和动态点分的教程好像很少……蒟蒻开篇blog记录一下吧……因为这是个大傻逼,可能有很多地方写错,欢迎在下面提出 参考文献:https://www.cnblogs.com/LadyL ...
- 程序猿的日常——Java基础之抽象类与接口、枚举、泛型
再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述 ...
- js事件委托 jQuery写法
http://www.cnblogs.com/liugang-vip/p/5616484.html 不是抄的,这篇文章写的细 这是js 事件委托写法 <!DOCTYPE html> < ...
- ReentrantLock获取到非公平锁的源码
/** * Performs lock. Try immediate barge, backing up to normal * acquire on failure. */ final void l ...
- 【GDOI2018模拟8】 数学竞赛 三角函数性质+记忆化搜索
数据范围:p,q≤20. 只能说我整个人傻逼了..... 我们考虑三角函数的部分性质: $sin(x)=\sqrt{ 1-cos^2(x)}$ $cos(x)=\sqrt{1-sin^2(x)}$ $ ...
- POJ 2304
#include<iostream>// cheng da cai zi 11. 18 解锁问题 using namespace std; #define f 360 int main() ...
- error 'there is already an open datareader associated with this command which must be closed first'
This can be easily solved by allowing MARS in your connection string. Add MultipleActiveResultSets=t ...
- ActiveRecord::Fixture::FormatError: ActiveRecord::Fixture::FormatError
环境:window 7+ruby2.33+rails5.0.. 该提示的意思是固件格式错误: 但是又没有提示是哪一行 非常蛋疼,我照成的原因居然是没有对齐,请看:(下面的activated_at没有和 ...
- javac之BridgeMethod及泛型擦除重写
When compiling a class or interface that extends a parameterized class or implements a parameterized ...
- php中接收参数,不论是来自GET还是POST方法
不多说,直接上代码, 其实也就是先用GET的方法去获取,如果值为空,在用POST方法去获取 写下来是为了方便和备忘 function getParam($str){ if ( isset( ...