@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,不了解一下,还真是不适应.这里备注一下. ...
随机推荐
- 记录MindSphere On Cloud Foundry的一次尝试过程
试验背景: 开始时间:2019年12月11日 结束时间:2019年12月13日 自己编写一个后台程序,尝试推送到Cloud Foundry上,并开放从MindSphere以外访问的权限. 程序实现以下 ...
- GOF学习笔记1:术语
1.abstract class 抽象类定义了一个接口,把部分或全部实现留给了子类,不能实例化. 2.abstract coupling 抽象耦合如果一个类A引用了另一个抽象类B,那么就说A是抽象耦 ...
- interface Part4(接口中的多态)
使用接口实现多态 需要满足以下两个条件. 定义接口并使用类实现了接口中的成员. 创建接口的实例指向不同的实现类对象. 假设接口名称为 ITest,分别定义两个实现类来实现接口的成员,示例代码如下. i ...
- 基于【 SpringBoot】一 || QQ授权流程
一.准备工作 1.qq开放平台应用申请,获取APP ID和APP Key 2.qq开放平台配置回调地址 二.服务器端生成授权链接 1.请求地址 https://graph.qq.com/oauth2. ...
- VBA错误处理(十八)
在(VBScript/VBA)编程中有三种类型的错误: 语法错误 运行时错误 逻辑错误 语法错误 语法错误(也称为解析错误)发生在VBScript的解释时间. 例如,下面一行导致语法错误,因为它缺少一 ...
- textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)
需求:将textarea与span标签组合,点击标签自动填入标签文本内容,再次点击删除标签文本对应内容 原理:点击标签时,将标签内容作为参数,将内容拼接在textarea的value后面,再次点击标签 ...
- Web编程规范之三层架构设计规范
本篇是我对Web开发规范中关于三层架构设计规范的一些浅见.虽然三层架构是比较普通,也比较简单的架构设计模式.但是随着业务的增长,涉及到的对象越来越多,处理的逻辑越来越复杂.这其中难免会出现设计不当,从 ...
- javascript之ECMAScript:语法的操作标准
一.如何书写一个javascript代码 javascript代码需要写在javascript标签中才会生效,而javascript标签可以写在任何地方,但考虑到规范化及页面的加载问题,最好是写在bo ...
- 理解ld-linux.so.2
翻译自:Understanding ld-linux.so.2 前言 ld-linux.so.2是linux的动态加载器(dynamic loader).本文试图就ld-linux.so.2如何与Li ...
- 【OF框架】搭建标准工作环境
前言 统一工作环境,统一工具集,是沟通效率的基础.如同语言一样,使用不同语言的人,需要花更多的精力去理解语言,然后才是理解语言的内容,而使用相同语言的人,对话过程直接进入到内容.对于语言不统一增加的效 ...