@ControllerAdvice 和 @ExceptionHandler
@ExceptionHandler的作用是把对不同异常处理抽取到不同的方法中。
@ControllerAdvice的作用是把控制器中 @ExceptionHandler、@InitBinder、@ModelAttribute方法抽取到一个专门的类当中。
@ControllerAdvice 和 @ExceptionHandler结合之后可以做控制层的统一异常处理
以前做法是,控制层是捕获一切异常,然后分类处理它们,如以下的例子:
@RequestMapping(value = "demo1", method = RequestMethod.POST)
@ResponseBody
public ResultBean demo1() {
try {
studentService.createOneStudent();
teacherService.createOneTeacher();
studentService.joinTeacher();
} catch (StudentExistsException e1) {
return new ResultBean(false, "学生已经存在。");
} catch (TeacherExistsException e2) {
return new ResultBean(false, "教师已经存在。");
} catch (AbnormalDataException e3) {
log.error("异常数据越过前端校验");
return new ResultBean(false, "请重试。");
} catch (NetworkException e4) {
return new ResultBean(false, "网络错误,请重试。");
} catch (Exception e5) {
log.error(e5.getMessage());
return new ResultBean(false, "请重试。");
}
return new ResultBean(true, null);
}
现在可以把异常处理抽取出来,不让异常处理的代码与调用业务层分发任务的代码搅合在一起。
@RequestMapping(value = "demo2", method = RequestMethod.POST)
@ResponseBody
// 异常直接往外抛
public ResultBean demo2() throws Exception {
studentService.createOneStudent();
teacherService.createOneTeacher();
studentService.joinTeacher();
return new ResultBean(true, null);
}
追加一个异常处理类
@ControllerAdvice
public class DemoExceptionHandler { private static final Logger log = LogManager.getLogger(ControllerExceptionHandler.class); @ExceptionHandler(StudentExistsException.class)
@ResponseBody
public ResultBean processStudentExistsException(NativeWebRequest request, StudentExistsException e) {
return new ResultBean(false, "学生已经存在。");
} @ExceptionHandler(TeacherExistsException.class)
@ResponseBody
public ResultBean processTeacherExistsException(NativeWebRequest request, TeacherExistsException e) {
return new ResultBean(false, "教师已经存在。");
} @ExceptionHandler(AbnormalDataException.class)
@ResponseBody
public ResultBean processAbnormalDataException(NativeWebRequest request, AbnormalDataException e) {
log.error("异常数据越过前端校验");
return new ResultBean(false, "请重试。");
} @ExceptionHandler(NetworkException.class)
@ResponseBody
public ResultBean processNetworkException(NativeWebRequest request, NetworkException e) {
return new ResultBean(false, "网络错误,请重试。");
} @ExceptionHandler(Exception.class)
@ResponseBody
public ResultBean processException(NativeWebRequest request, Exception e) {
log.error(e5.getMessage());
return new ResultBean(false, "请重试。");
} }
最后,必须在SpirngMVC的配置文件里追加context:component-scan标签,用于扫描异常处理类
@ControllerAdvice 和 @ExceptionHandler的更多相关文章
- @ControllerAdvice和@ExceptionHandler
1. 使用 @ControllerAdvice和@ExceptionHandler处理全局异常 1. 新建异常信息实体类 非必要的类,主要用于包装异常信息. package com.test.exce ...
- springmvc 全局的异常拦截处理 @ControllerAdvice注解 @ExceptionHandler
第一步: Dispatcher前端控制器的源码中 默认的 private boolean throwExceptionIfNoHandlerFound = false;说明如果没有找到匹配的执行器,不 ...
- @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常
@ControllerAdvice 和 @ExceptionHandler 的区别 ExceptionHandler, 方法注解, 作用于 Controller 级别. ExceptionHandle ...
- Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。
通过java原生的@Valid注解和spring的@ControllerAdvice和@ExceptionHandler实现全局异常处理的方法: controller中加入@Valid注解: @Req ...
- 统一异常处理@ControllerAdvice
一.异常处理 有异常就必须处理,通常会在方法后面throws异常,或者是在方法内部进行try catch处理. 直接throws Exception 直接throws Exception,抛的异常太过 ...
- 从源码看全局异常处理器@ExceptionHandler&@ExceptionHandler的生效原理
1.开头在前 日常开发中,几乎我们的项目都会用到异常处理器,我们通常会定制属于自己的异常处理器,来处理项目中大大小小.各种各样的异常.配置异常处理器目前最常用的方式应该是使用@ControllerAd ...
- SpringBoot RESTful 应用中的异常处理小结
转载:https://segmentfault.com/a/1190000006749441 @ControllerAdvice 和 @ExceptionHandler 的区别 ExceptionHa ...
- 详细解说Java Spring的JavaConfig注解 【抄】
抄自: http://www.techweb.com.cn/network/system/2016-01-05/2252188.shtml @RestController spring4为了更方便的支 ...
- Java Spring的 JavaConfig 注解
序 传统spring一般都是基于xml配置的,不过后来新增了许多JavaConfig的注解.特别是springboot,基本都是清一色的java config,不了解一下,还真是不适应.这里备注一下. ...
随机推荐
- apply,call和bind的使用及区别
1.用途 1)apply,call和bind都是 用来改变this的指向 2)apply和call会让当前函数立即执行,而bind会返回一个函数,后续需要的时候再调用执行 2.this指向问题 thi ...
- java实现HTTP请求 HttpUtil
示例: package com.sensor.utils; import java.net.HttpURLConnection; import java.net.URL; public class H ...
- 升级win10 1903版后,vmware打开虚拟机黑屏的解决办法
按照网上给的方法(1-3),又增加了几步(从4开始,只在我自己电脑上实践过): 1. 打开cmd,执行以下命令 netsh winsock reset 2. 重启电脑 3. 以管理员身份执行vmwar ...
- ElementUI对话框(dialog)提取为子组件
需求:在页面的代码太多,想把弹窗代码提取为子组件,复用也方便. 这里涉及到弹窗el-dialog的一个属性show-close: show-close="false"是设置不显 ...
- JS做动态表格
在后台将数据发送过来后,你需要将这些数据做成表格,实现一般表格管理功能 例如这种数据格式, 首先要创建table 在table中添加thead 在thead中添加tr 循环数组,且创建开头的inpu ...
- OpenStack kilo版(5) Neutron部署
neutron简介: Neutron 通过 plugin 和 agent 提供的网络服务. plugin 位于 Neutron server,包括 core plugin 和 service plug ...
- mysql8.0授权远程登录
之前一直用mysql5.6 远程授权登录,后来换mysql8.0原来的授权方式报错 mysql> grant all privileges on *.* to 'root'@'%' identi ...
- mysql存储过程事务
之前在写一个存储过程的时候由于不仔细导致数据库锁死,这里反省一下. 存储过程是这样的:把数据按顺序插入三张表,如果其中任何一处出错,就把前面已经做了的操作进行回滚,存储过程里面是用事务实现的,我是这么 ...
- JMeter测试HBase
在网上找了关于jmeter连接hbase的方式,主要分为两种:通过导入jar包连接(Java Request)和通过BeanShell远程连接,由于刚接触jmeter没多久,对BeanShell还不熟 ...
- SQL SERVER-邮件配置
存储发邮件 USE msdb GO EXEC sp_send_dbmail @profile_name = 'mail_pro', @recipients='Jinwei.chang@quantacn ...