@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的更多相关文章

  1. @ControllerAdvice和@ExceptionHandler

    1. 使用 @ControllerAdvice和@ExceptionHandler处理全局异常 1. 新建异常信息实体类 非必要的类,主要用于包装异常信息. package com.test.exce ...

  2. springmvc 全局的异常拦截处理 @ControllerAdvice注解 @ExceptionHandler

    第一步: Dispatcher前端控制器的源码中 默认的 private boolean throwExceptionIfNoHandlerFound = false;说明如果没有找到匹配的执行器,不 ...

  3. @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常

    @ControllerAdvice 和 @ExceptionHandler 的区别 ExceptionHandler, 方法注解, 作用于 Controller 级别. ExceptionHandle ...

  4. Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。

    通过java原生的@Valid注解和spring的@ControllerAdvice和@ExceptionHandler实现全局异常处理的方法: controller中加入@Valid注解: @Req ...

  5. 统一异常处理@ControllerAdvice

    一.异常处理 有异常就必须处理,通常会在方法后面throws异常,或者是在方法内部进行try catch处理. 直接throws Exception 直接throws Exception,抛的异常太过 ...

  6. 从源码看全局异常处理器@ExceptionHandler&@ExceptionHandler的生效原理

    1.开头在前 日常开发中,几乎我们的项目都会用到异常处理器,我们通常会定制属于自己的异常处理器,来处理项目中大大小小.各种各样的异常.配置异常处理器目前最常用的方式应该是使用@ControllerAd ...

  7. SpringBoot RESTful 应用中的异常处理小结

    转载:https://segmentfault.com/a/1190000006749441 @ControllerAdvice 和 @ExceptionHandler 的区别 ExceptionHa ...

  8. 详细解说Java Spring的JavaConfig注解 【抄】

    抄自: http://www.techweb.com.cn/network/system/2016-01-05/2252188.shtml @RestController spring4为了更方便的支 ...

  9. Java Spring的 JavaConfig 注解

    序 传统spring一般都是基于xml配置的,不过后来新增了许多JavaConfig的注解.特别是springboot,基本都是清一色的java config,不了解一下,还真是不适应.这里备注一下. ...

随机推荐

  1. 记录MindSphere On Cloud Foundry的一次尝试过程

    试验背景: 开始时间:2019年12月11日 结束时间:2019年12月13日 自己编写一个后台程序,尝试推送到Cloud Foundry上,并开放从MindSphere以外访问的权限. 程序实现以下 ...

  2. GOF学习笔记1:术语

    1.abstract class 抽象类定义了一个接口,把部分或全部实现留给了子类,不能实例化. 2.abstract coupling  抽象耦合如果一个类A引用了另一个抽象类B,那么就说A是抽象耦 ...

  3. interface Part4(接口中的多态)

    使用接口实现多态 需要满足以下两个条件. 定义接口并使用类实现了接口中的成员. 创建接口的实例指向不同的实现类对象. 假设接口名称为 ITest,分别定义两个实现类来实现接口的成员,示例代码如下. i ...

  4. 基于【 SpringBoot】一 || QQ授权流程

    一.准备工作 1.qq开放平台应用申请,获取APP ID和APP Key 2.qq开放平台配置回调地址 二.服务器端生成授权链接 1.请求地址 https://graph.qq.com/oauth2. ...

  5. VBA错误处理(十八)

    在(VBScript/VBA)编程中有三种类型的错误: 语法错误 运行时错误 逻辑错误 语法错误 语法错误(也称为解析错误)发生在VBScript的解释时间. 例如,下面一行导致语法错误,因为它缺少一 ...

  6. textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)

    需求:将textarea与span标签组合,点击标签自动填入标签文本内容,再次点击删除标签文本对应内容 原理:点击标签时,将标签内容作为参数,将内容拼接在textarea的value后面,再次点击标签 ...

  7. Web编程规范之三层架构设计规范

    本篇是我对Web开发规范中关于三层架构设计规范的一些浅见.虽然三层架构是比较普通,也比较简单的架构设计模式.但是随着业务的增长,涉及到的对象越来越多,处理的逻辑越来越复杂.这其中难免会出现设计不当,从 ...

  8. javascript之ECMAScript:语法的操作标准

    一.如何书写一个javascript代码 javascript代码需要写在javascript标签中才会生效,而javascript标签可以写在任何地方,但考虑到规范化及页面的加载问题,最好是写在bo ...

  9. 理解ld-linux.so.2

    翻译自:Understanding ld-linux.so.2 前言 ld-linux.so.2是linux的动态加载器(dynamic loader).本文试图就ld-linux.so.2如何与Li ...

  10. 【OF框架】搭建标准工作环境

    前言 统一工作环境,统一工具集,是沟通效率的基础.如同语言一样,使用不同语言的人,需要花更多的精力去理解语言,然后才是理解语言的内容,而使用相同语言的人,对话过程直接进入到内容.对于语言不统一增加的效 ...