引言

前后端分离开发,后台有时候会出现不可预知的异常(运行时异常),在实际生产中通常需要统一返回符合一定响应结构的异常信息给前端,这一方面可以避免用户看到后台的报错信息,一方面也是保护后端程序免受恶意用户的试探。

简单总结一个Spring框架下的全局异常捕获的实现方式——@RestControllerAdvice。

一、代码演示

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;/*** 统一异常捕获类*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {@ExceptionHandler(RuntimeException.class)public CommonResp runtimeExceptionProcess(Exception e) {log.error("统一异常捕获:{}", e.getMessage());e.printStackTrace();CommonResp resp = new CommonResp("9999", "服务器异常!");log.info("统一异常响应:{}", resp);return resp;}
}

二、@RestControllerAdvice

Advice在AOP编程中代表了切面的执行逻辑,相当于 OOP 中的方法。

@RestControllerAdvice 是 Spring 3.2引入的一个协助 Controller 层织入切面逻辑的AOP注解,标记类上,类似的注解还有@ControllerAdvice。二者的区别是前者只用于基于REST API风格的 JSON响应结果的controller,简单的说,@ControllerAdvice + @ResponseBody = @RestControllerAdvice 。

@ControllerAdvice
public class MyControllerAdvice {@ResponseBody@ExceptionHandler(value = Exception.class)public Map errorHandler(Exception ex) {// 异常处理逻辑return map;}
}

三、ResponseEntityExceptionHandler

ResponseEntityExceptionHandler 包装了各种Spring MVC在处理请求时可能抛出各类异常的处理,通过对该类的继承,我们可以重写对应的处理逻辑。

比如,我们可以通过继承该类,在我们的@RestControllerAdvice 类中重写 handleBindException(..) 方法,来处理数据绑定的异常信息。

当然,第一节中的代码案例其实并不需要继承  ResponseEntityExceptionHandler ,但也可以作为一种附加参考,方便以后对特定异常进行扩展,当然也可以自定义异常来处理。

Spring 全局异常捕获相关推荐

  1. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获

    Spring boot异常统一处理方法:@ControllerAdvice注解的使用.全局异常捕获.自定义异常捕获 参考文章: (1)Spring boot异常统一处理方法:@ControllerAd ...

  2. spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获

    spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...

  3. Java 捕获 mybatis异常_3 springboot集成mybatis和全局异常捕获

    mybatis有两种方式,一种是基于XML,一种是基于注解 springboot集成mybatis 首先先创建表,这里都简化了 DROP TABLE IF EXISTS `user`; CREATE ...

  4. SpringBoot精通系列-如何封装Spring Boot异常捕获

    导语   在Spring Boot开发过程中,不难避免的就是异常处理,有些异常是通过try catch方式捕获,或者是通过Throw直接抛出,但是这种方式的话对于客户端是不友好的,所以希望是通过编码的 ...

  5. 《全局异常捕获》劝劝潘子吧,别再用trycatch来处理异常了

    人世仙家本自殊,何须相见向中途.惊鸿瞥过游龙去,漫恼陈王一事无. 嗨,大家好,我是洛神,性别男.一个来自快乐星球的程序员. 欢迎大家专注我的公众号[程序员洛神],不仅分享技术,还会分享生活趣事.体育. ...

  6. 编码技巧——全局异常捕获统一的返回体业务异常

    在开发中,关于异常的捕获曾经是一个头疼的问题:本篇介绍几个方法,如何优雅的捕获处理业务异常: 已检查异常和未检查异常? 先做个介绍,异常Exception分为运行时异常(RuntimeExceptio ...

  7. SpringBoot框架搭建(redis多数据源+数据库多数据源+全局异常捕获)

    java骨架 目录结构 ├── mvnw ├── mvnw.cmd ├── pom.xml ├── README.md ├── src/ 源文件目录 │ ├── main │ │ ├── java │ ...

  8. @ExceptionHandler全局异常捕获响应体返回中文乱码

    问题现象 在全局异常处理后,发现响应体返回中文的错误信息竟然乱码了,如下: 问题原因 Controller @RequestMapping(value = "/user/{user_id}& ...

  9. spring全局异常抓取validation校验信息

    spring全局异常抓取validation校验信息 参考文章: (1)spring全局异常抓取validation校验信息 (2)https://www.cnblogs.com/jianxiaopo ...

最新文章

  1. Tutorial——使用Maven开发Cloud Driver
  2. Kaggle知识点:时序数据与Embedding
  3. Java程序员面试必备的一些流程图
  4. 1t硬盘怎么分区最好_这下尴尬了,电脑硬盘分区常见误区,移动硬盘分区方法...
  5. 用户修改了信息jwt服务器怎么识别,django使用JWT保存用户登录信息
  6. struts2+spring+mybatis简单配置
  7. windows mysql 和linux mysql解决乱码问题
  8. 层次分析法在高校教学评价体系中的应用(原理+实例+工具)
  9. SPSS 探索性因素分析与验证性因素分析的区别【SPSS 034期】
  10. c语言写长方形体积公式是什么,长方体的体积公式 长方体的体积公式是什么
  11. 八股文-ArrayList
  12. 又现信息泄露事 融云通讯安全守护之道
  13. iOS-图片轮播-SDCycleSCrollView的使用
  14. Java的长整型Long/long后面的数字什么情况下必须加L?
  15. Flink实战(九十三):数据倾斜(二)keyby 窗口数据倾斜的优化
  16. linux写画小猪佩奇代码,代码绘制一直小猪佩奇
  17. wwwwwwwwwww
  18. 阿里价值观大辩论:低 P 碰红线,低 P 没了;高 P 碰红线,红线没了,其背后……...
  19. 2024龙年春节倒计时
  20. 【2023 阿里云云计算工程师 ACP 认证练习题库】01、VPC 专有网络题库

热门文章

  1. 漫画:Integer 竟然有 4 种比较方法?
  2. ASP.NET MVC 3发布报错(ASP.NET MVC 3在没有安装环境的服务器上运行)的解决方案
  3. eclipse搭建maven开发环境
  4. iterm2一键登陆服务器(门神权限不用每次都输密码进行验证)
  5. C#利用反射实现动态加载程序集简单案例
  6. python不能卸载原因_linux上python卸载不了是什么原因?
  7. 通达信公式大全_通达信MACD金叉的选股公式大全
  8. mysql 字符集 校验规则_MySQL字符集及校验规则
  9. linux命令history作用,Linux命令:history命令历史的管理及用法
  10. 搜狗高速浏览器打开网页没有声音怎么办