@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. 二、openfeign生成并调用客户端动态代理对象

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 上一篇文章中,我们了解到了@FeignClient注解的接口被扫描到以后,会生成一个Fe ...

  2. 通过 Java 压缩文件,打包一个 tar.gz 采集器包

    一.如何通过 Java 打包文件 1.1 添加 Maven 依赖 <dependency> <groupId>org.apache.commons</groupId> ...

  3. navigator(浏览器对象)Screen对象(屏幕)

    浅谈navigator对象: 注意:不是所有浏览器都支持 .cookieEnabled  判断是否启用了cookie  在客户端硬盘持久保存用户私密数据的小文件 .plugins 浏览器安装的所有插件 ...

  4. Java 之 反射机制

    反射:框架设计的灵魂 框架:是一个可以供我们使用的半成品软件.可以在框架的基础上进行软件开发,简化编码. 反射:将类的各个组成部分封装为其他对象,这就是反射机制. 好处: 1. 可以在程序运行过程中, ...

  5. Qt QPushButton 背景色

    正常状态:黑底(背景色),白字(前景色),圆角,向外凸起 鼠标停留:背景和前景反色 鼠标按下:背景色变为淡蓝色,向内凹陷 ui->pushButton->setStyleSheet(&qu ...

  6. obj = obj || {} 分析这个代码的起到的作用

    情况一: <script> function test(obj) { console.log(obj.value) } function student() { this.value = ...

  7. Vue列表动画----自己做的

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Windows 网络凭证

    前言 单位内部,员工之间电脑免不了要相互访问(eg:访问共享文件夹).这就引出网络凭证的概念,即你用什么身份访问对端计算机. 实验环境 创建共享文件夹 WinSrv 2008上新建的文件夹shared ...

  9. MySQL 数据库的高可用性分析

    MySQL数据库是目前开源应用最大的关系型数据库,有海量的应用将数据存储在MySQL数据库中.存储数据的安全性和可靠性是生产数据库的关注重点.本文分析了目前采用较多的保障MySQL可用性方案. MyS ...

  10. python小知识点汇总

    一 写mysql 场景:自动化用例中需要构造数据,写入redis 表中已有该primary_key的记录,在现有基础上更新字段 表中无该记录,需要插入 # 请求传入table字段,db.table,c ...