@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. python之基础总结(飞机大战)

    一.学习python有一段时间了,总体上手还是挺好的,但是有些东西还是和Java存在着一定的区别,这里主要是通过学习,然后自己去编写一个案例.从中学习到的一些东西,这里分享出来,如果存在不正确的地方还 ...

  2. Spring Boot整合Spring Session实战

    传统java web应用session都是由应用服务器(如tomcat)保存在内存中,这对应但节点应用来说没问题:但对于应用集群来说会造成各节点之间的session无法共享,一个节点挂掉后,其他节点接 ...

  3. VBA错误处理(十八)

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

  4. hystrix配置

    一.hystrix在生产中的建议 1.保持timeout的默认值(1000ms),除非需要修改(其实通常会修改) 2.保持threadpool的的线程数为10个,除非需要更多 3.依赖标准的报警和监控 ...

  5. JavaScript,遍历,for

    (for循环,for...in ,for...of ,forEach)(:for in总是得到数组,字符串的下标,而for of和forEach一样,是直接得到值) (forEach() 方法用于调用 ...

  6. PE重装系统

    PE重装系统 PE: 含义:全称 Windows Preinstall Environment,即Windows 预安装环境 作用: 是一个用于Windows安装准备的最小操作系统,其实就是一个简易版 ...

  7. 阿里P7详细解答JVM性能调优之监控工具

    javap 和 javac javac -verbose 类名.java java -verbose 类名 javap -c 类名 javap -verbose 类名 JAVAP -HELP 用法: ...

  8. MySQL主从复制(Centos6.3&MySQL5.6)

    环境: Master:Centos 6.3        192.168.1.4  Slave:Centos 6.3            192.168.1.5 MySQL: MySQL-5.6.2 ...

  9. reGeorg+Proxifier使用

    reGeorg利用了socks5协议建立隧道,结合Proxifier可将目标内网代理出来. 项目地址: https://github.com/sensepost/reGeorg 该文件下支持php,a ...

  10. Python + Selenium 主要实现的功能

    selenium 技术 元素定位的几种方法 WebDriver API ,selenium IDE,selenium grid python 技术 函数.类.方法: 读写文件, unitest单元测试 ...