一、单个controller范围的异常处理

  1. package com.xxx.secondboot.web;
  2.  
  3. import org.springframework.web.bind.annotation.ExceptionHandler;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestMethod;
  6. import org.springframework.web.bind.annotation.RestController;
  7.  
  8. import com.xxx.secondboot.exception.MyExceptionResponse;
  9.  
  10. import io.swagger.annotations.Api;
  11.  
  12. @Api("测试controllerAdvice和全局异常处理")
  13. @RestController
  14. @RequestMapping("/advice1")
  15. public class AdviceController {
  16.  
  17. @RequestMapping(value = "/test1", method = RequestMethod.GET)
  18. public String test1() {
  19. throw new RuntimeException("advice1 - exception1");
  20. }
  21.  
  22. @RequestMapping(value = "/test2", method = RequestMethod.GET)
  23. public String test2() {
  24. throw new RuntimeException("advice1 - exception2");
  25. }
  26.  
  27. @ExceptionHandler(RuntimeException.class)
  28. public MyExceptionResponse exceptionHandler() {
  29. MyExceptionResponse resp = new MyExceptionResponse();
  30. resp.setCode(300);
  31. resp.setMsg("exception-Handler");
  32. return resp;
  33. }
  34.  
  35. }

说明:

  • 在controller中加入被@ExceptionHandler修饰的类即可(在该注解中指定该方法需要处理的那些异常类)
  • 该异常处理方法只在当前的controller中起作用

二、全部controller范围内起作用的异常处理(全局异常处理)

1、全局异常处理类

  1. package com.xxx.secondboot.web;
  2.  
  3. import javax.servlet.http.HttpServletResponse;
  4.  
  5. import org.springframework.web.bind.annotation.ControllerAdvice;
  6. import org.springframework.web.bind.annotation.ExceptionHandler;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import org.springframework.web.bind.annotation.RestController;
  9.  
  10. import com.xxx.secondboot.exception.MyExceptionResponse;
  11. import com.xxx.secondboot.exception.MyRuntimeException;
  12.  
  13. //@ControllerAdvice(annotations=RestController.class)
  14. //@ControllerAdvice(basePackages={"com.xxx","com.ooo"})
  15. @ControllerAdvice
  16. public class GlobalExceptionHandler {
  17. @ExceptionHandler(RuntimeException.class)
  18. // @ExceptionHandler(value={RuntimeException.class,MyRuntimeException.class})
  19. // @ExceptionHandler//处理所有异常
  20. @ResponseBody //在返回自定义相应类的情况下必须有,这是@ControllerAdvice注解的规定
  21. public MyExceptionResponse exceptionHandler(RuntimeException e, HttpServletResponse response) {
  22. MyExceptionResponse resp = new MyExceptionResponse();
  23. resp.setCode(300);
  24. resp.setMsg("exception-Handler");
  25. // response.setStatus(600);
  26. return resp;
  27. }
  28. }

说明:

  • @ControllerAdvice是controller的一个辅助类,最常用的就是作为全局异常处理的切面类
  • @ControllerAdvice可以指定扫描范围
  • @ControllerAdvice约定了几种可行的返回值,如果是直接返回model类的话,需要使用@ResponseBody进行json转换
    • 返回String,表示跳到某个view
    • 返回modelAndView
    • 返回model + @ResponseBody

2、controller

  1. package com.xxx.secondboot.web;
  2.  
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.RestController;
  6.  
  7. import io.swagger.annotations.Api;
  8.  
  9. @Api("测试controllerAdvice和全局异常处理")
  10. @RestController
  11. @RequestMapping("/advice1")
  12. public class AdviceController {
  13.  
  14. @RequestMapping(value = "/test1", method = RequestMethod.GET)
  15. public String test1() {
  16. throw new RuntimeException("advice1 - exception1");
  17. }
  18.  
  19. @RequestMapping(value = "/test2", method = RequestMethod.GET)
  20. public String test2() {
  21. throw new RuntimeException("advice1 - exception2");
  22. }
  23.  
  24. // @ExceptionHandler(RuntimeException.class)
  25. // public MyExceptionResponse exceptionHandler() {
  26. // MyExceptionResponse resp = new MyExceptionResponse();
  27. // resp.setCode(300);
  28. // resp.setMsg("exception-Handler");
  29. // return resp;
  30. // }
  31.  
  32. }

注意:

  • 同一个异常被局部范围异常处理器和全局范围异常处理器同时覆盖,会选择小范围的局部范围处理器
  • 同一个异常被小范围的异常类和大范围的异常处理器同时覆盖,会选择小范围的异常处理器

参考自:

  • http://jinnianshilongnian.iteye.com/blog/1866350 开涛的@ControllerAdvice(三个作用)
  • http://www.tuicool.com/articles/fA7nuii                springboot约定的异常处理体系
  • https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc springMVC异常处理体系
  • http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/ springMVC异常处理体系

【第二十三章】 springboot + 全局异常处理的更多相关文章

  1. 第二十三章 springboot + 全局异常处理

    一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation ...

  2. 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记

    第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...

  3. Gradle 1.12用户指南翻译——第二十三章. Java 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  4. “全栈2019”Java多线程第二十三章:活锁(Livelock)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java第二十三章:流程控制语句中决策语句switch上篇

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. springboot 全局异常处理

    springboot 全局异常处理 研究了半天springboot的全局异常处理,虽然还是需要再多整理一下,但是对于常见的404和500足以可以区分开,能够根据这两个异常分别处理 首先配置视图解析路径 ...

  7. 20190928 On Java8 第二十三章 注解

    第二十三章 注解 定义在 java.lang 包中的5种标准注解: @Override:表示当前的方法定义将覆盖基类的方法.如果你不小心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示. ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...

  9. 第二十三章 多项目集中权限管理及分布式会话——《跟我学Shiro》

    二十三章 多项目集中权限管理及分布式会话——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro  目录贴:跟我学Shiro目录贴 在做一些企业内部项目时或一些互联网后台时 ...

随机推荐

  1. 【Python】唯品会购买商品

    操作过程:唯品会进入之后,搜索商品,浏览网页,略掉不能选择的尺寸,选择之后,点击商品选择数量的加号,然后加入购物车. 实现代码如下: # coding=utf-8 from selenium impo ...

  2. (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb)

    (3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb) 关键词:mysql日志文件,mysqldumpslow分析工具 目录:日志文件的分类 1. ...

  3. 迁移到 Linux :入门介绍 | Linux 中国

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79001952 这个新文章系列将帮你从其 ...

  4. 通过Tacker将NFV引入OpenStack

    14年的这个时候,我们还在OpenStack社区中为NFV是否属于OpenStack而争论不休.如今这一争议已经被解决了.OpenStack已经成为NFV讨论中的重要部分,正如下面的ETSI MANO ...

  5. vue使用resource传参数

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

  6. hdu1864最大报销额(01背包)

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=187#problem/G 该题要注意的就是每张单子A种类的总和不能大与600,同 ...

  7. 【转】SVM入门(一)SVM的八股简介

    (一)SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够 ...

  8. LeetCode--Two_Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  9. iOS 自定义日志输出

    在做iOS开发过程中,我们经常需要输出日志来查看某些数据是否打印出来,或者查看查个类是否被调用了. 系统默认的是NSLog(@"xxxx %d",1) ,但如果该APP要发布到商店 ...

  10. js实现轮播图2

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