Springboot对Controller层方法进行统一异常处理
Controller层方法,进行统一异常处理
提供两种不同的方案,如下:
- 方案1:使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionHandler 注解实现;
- 方案2: 使用AOP技术实现;
现在分别介绍
方案1: 使用@ControllerAdvice 和 @ExceptionHandler
@ControllerAdvice 或 @RestControllerAdvice
使用@ControllerAdvice
注解来增强所有的 @RequestMapping
标记的方法;
官方解释:
It is typically used to define @ExceptionHandler
,@InitBinder
, and @ModelAttribute
methods that apply to all @RequestMapping
methods.
@ExceptionHandler
- 只能声明方法;
- 与
@ControllerAdvice
结合使用,可以用于增强所有@RequestMapping
方法的异常处理;
核心代码
完整代码请参考:Springboot对Controller层方法进行统一异常处理
@RestControllerAdvice
public class ControllerExceptionHandleAdvice {
private final static Logger logger = LoggerFactory.getLogger(ControllerExceptionHandleAdvice.class); @ExceptionHandler
public ResultEntity handler(HttpServletRequest req, HttpServletResponse res, Exception e) {
logger.info("Restful Http请求发生异常..."); if (res.getStatus() == HttpStatus.BAD_REQUEST.value()) {
logger.info("修改返回状态值为200");
res.setStatus(HttpStatus.OK.value());
} if (e instanceof NullPointerException) {
logger.error("代码00:" + e.getMessage(), e);
return ResultEntity.fail("发生空指针异常");
} else if (e instanceof IllegalArgumentException) {
logger.error("代码01:" + e.getMessage(), e);
return ResultEntity.fail("请求参数类型不匹配");
} else if (e instanceof SQLException) {
logger.error("代码02:" + e.getMessage(), e);
return ResultEntity.fail("数据库访问异常");
} else {
logger.error("代码99:" + e.getMessage(), e);
return ResultEntity.fail("服务器代码发生异常,请联系管理员");
}
}
}
方案2:使用AOP技术
完整代码: 【AOP】Springboot对Controller层方法进行统一异常处理
核心代码
- @Aspect 注解;
- 织入点:
- 方法返回值为:ResultEntity
- 所有带有controller层级的包 下面的 所有类的所有方法
- @Around("execution(public com.ssslinppp.model.ResultEntity com...controller...*(..))")
@Component
@Aspect
public class ControllerAspect {
public static final Logger logger = LoggerFactory.getLogger(ControllerAspect.class); @Around("execution(public com.ssslinppp.model.ResultEntity com..*.controller..*.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint pjp) {
Stopwatch stopwatch = Stopwatch.createStarted(); ResultEntity<?> resultEntity;
try {
logger.info("执行Controller开始: " + pjp.getSignature() + " 参数:" + Lists.newArrayList(pjp.getArgs()).toString());
resultEntity = (ResultEntity<?>) pjp.proceed(pjp.getArgs());
logger.info("执行Controller结束: " + pjp.getSignature() + ", 返回值:" + resultEntity.toString());
logger.info("耗时:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) + "(毫秒).");
} catch (Throwable throwable) {
resultEntity = handlerException(pjp, throwable);
} return resultEntity;
} private ResultEntity<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
ResultEntity<?> resultEntity = null;
if (e instanceof RuntimeException) {
logger.error("RuntimeException{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" + e.getMessage() + "}", e);
resultEntity = ResultEntity.fail(e.getMessage());
} else {
logger.error("异常{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" + e.getMessage() + "}", e);
resultEntity = ResultEntity.fail(e.getMessage());
} return resultEntity;
}
}
Springboot对Controller层方法进行统一异常处理的更多相关文章
- 【异常处理】Springboot对Controller层方法进行统一异常处理
Controller层方法,进行统一异常处理 提供两种不同的方案,如下: 方案1:使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionH ...
- springMVC中controller层方法中使用private和public问题
楼主一直习惯使用public,偶尔手误也可能使用private,但是发觉也没啥区别,都能调用service层,注入bean. 后来做一个新项目时,发觉自己以前的写的部分功能报错,当时有点懵逼,,找了半 ...
- SpringBoot入门系列(十一)统一异常处理的实现
前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务和定时任务.不清楚的朋友可以看看之前的文章:<Spring Boot 入门系列文章> 接下来主 ...
- SpringBoot测试Controller层
一.准备工作 1.导入测试依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- Junit mockito 测试Controller层方法有Pageable异常
1.问题 在使用MockMVC+Mockito模拟Service层返回的时候,当我们在Controller层中参数方法调用有Pageable对象的时候,我们会发现,我们没办法生成一个Pageable的 ...
- PowerMock+SpringMVC整合并测试Controller层方法
PowerMock扩展自Mockito,实现了Mockito不支持的模拟形式的单元测试.PowerMock实现了对静态方法.构造函数.私有方法以及final方法的模拟支持,对静态初始化过程的移除等强大 ...
- spring security 在controller层 方法级别使用注解 @PreAuthorize("hasRole('ROLE_xxx')")设置权限拦截 ,无权限则返回403
1.前言 以前学习的时候使用权限的拦截,一般都是对路径进行拦截 ,要么用拦截器设置拦截信息,要么是在配置文件内设置拦截信息, spring security 支持使用注解的形式 ,写在方法和接口上拦截 ...
- SpringBoot第十四篇:统一异常处理
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10984081.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 本文将谈论 ...
- SpringBoot接口 - 如何优雅的写Controller并统一异常处理?
SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai 为什么要优雅的处理异常 如果我们不统一的处理异常,经 ...
随机推荐
- 小记---------有关hadoop的HDFS命令行操作
HDFS命令操作 首先需要在xshell启动hadoop start-all.sh or start-hdfs.sh hadoop fs -ls / (显示当前目录下所有文件) h ...
- 洛谷 P5239 回忆京都 题解
题面 裸的杨辉三角前缀和,但----- 在求前缀和的时候有可能得到一个负数(由于取模的原因),所以一定要加上模数后再取模!!!! #include <bits/stdc++.h> #def ...
- OLT设置vlan透传及ONU端口划vlan
CZ-PX-ShangShi-FTTH-OLT-A#show runn System current configuration:!Software Version ISCOM5800E-SMCB_1 ...
- CF Gym102028G Shortest Paths on Random Forests
传送门 这题要求的期望,就是总权值(所有不在同一个连通块点对的贡献+同一连通块点对的贡献)/总方案(森林个数) 先求森林个数,森林是由一堆树组成的,而根据purfer序列,一棵\(n\)个点的有标号的 ...
- generator 到 async 的简单理解。
generator 到 async 的简单理解.觉得实现方式很有意思. 1. generator generator 函数返回一个遍历器对象 遍历器对象 每次调用next 方法 返回 有着value ...
- vue.js 分页加载,向上滑动,依次加载数据。
export default { layout: 'default', data(){ return{ page:1, pageSize:10, orderListArr:[], prodListLo ...
- springboot学习2
项目导入eclipse 先检测是否安装有gradle插件 然后点击 finish 按钮 hello world实例 Application.java package com.example.demo ...
- MongoDB入门_shell基本操作
使用shell客户端连接mongoDB数据库 [root@localhost mongodb_simple]# ./bin/mongo /admin mongoDB的简单基本操作 1. mongoDB ...
- 3U VPX 加固智能计算异构服务器
3U VPX 加固智能计算异构服务器 北京太速科技有限公司在线客服:QQ:448468544 公司网站:www.orihard.com联系电话:15084122580
- 应急响应中find命令总结
在应急响应中,我们经常会使用find命令来查找系统中被黑客修改过的文件,或者被上传的木马后门文件,灵活使用find命令可以达到事半功倍的效果,现总结下使用技巧 举例,查找最近被更改的jsp文件 fin ...