对于全局异常需要认识两个注解
@RestControllerAdvice,@ExceptionHandler

1、 @RestControllerAdvice

组成:@ControllerAdvice、@ResponseBody

@RestControllerAdvice特点:
(1)通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置,他可以管理所有的Controller。
(2)注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
(3)@RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
(4)@ExceptionHandler:用于指定异常处理方法。当与@RestControllerAdvice配合使用时,用于全局处理控制器里的异常。
(5)

  • @InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
  • @ModelAttribute:本来作用是绑定键值对到Model中,当与@ControllerAdvice配合使用时,可以让全局的@RequestMapping都能获得在此处设置的键值对**

2、@ExceptionHandler注解我们一般是用来自定义异常的。
可以认为它是一个异常拦截器(处理器)。

@ExceptionHandler(xxx.class)

xxx.class是具体的异常类
例如:NullPointerException

例子

全局异常捕获

自定义异常类

自定义异常类继承RuntimeException

public class Mall4cloudException extends RuntimeException {private static final long serialVersionUID = 1L;private Object object;private ResponseEnum responseEnum;public Mall4cloudException(String msg) {super(msg);}public Mall4cloudException(String msg, Object object) {super(msg);this.object = object;}public Mall4cloudException(String msg, Throwable cause) {super(msg, cause);}public Mall4cloudException(ResponseEnum responseEnum) {super(responseEnum.getMsg());this.responseEnum = responseEnum;}public Mall4cloudException(ResponseEnum responseEnum, Object object) {super(responseEnum.getMsg());this.responseEnum = responseEnum;this.object = object;}public Object getObject() {return object;}public ResponseEnum getResponseEnum() {return responseEnum;}}

自定义返回状态码类型

package com.mall4j.cloud.common.response;/*** @author FrozenWatermelon* @date 2020/7/9*/
public enum ResponseEnum {/*** ok*/OK("00000", "ok"),/*** 用于直接显示提示用户的错误,内容由输入内容决定*/SHOW_FAIL("A00001", ""),/*** 方法参数没有校验,内容由输入内容决定*/METHOD_ARGUMENT_NOT_VALID("A00002", ""),/*** 无法读取获取请求参数*/HTTP_MESSAGE_NOT_READABLE("A00003", "请求参数格式有误"),/*** 未授权*/UNAUTHORIZED("A00004", "Unauthorized"),/*** 服务器出了点小差*/EXCEPTION("A00005", "服务器出了点小差"),/*** 数据异常*/DATA_ERROR("A00007", "数据异常,请刷新后重新操作"),/*** 一些需要登录的接口,而实际上因为前端无法知道token是否已过期,导致token已失效时,* 应该返回一个状态码,告诉前端token已经失效了,及时清理*/CLEAN_TOKEN("A00008", "clean token"),/*** 刷新token已过期*/REFRESH_TOKEN_EXIST("A00009", "refresh token exist"),/*** 数据不完整*/DATA_INCOMPLETE("A00010", "数据不完整"),/*** 01开头代表商品*/SPU_NOT_EXIST("A01000", "spu not exist"),/*** 02开头代表购物车*/SHOP_CART_NOT_EXIST("A02000", "shop cart not exist"),/*** 03开头代表订单*/ORDER_NOT_EXIST("A03000", "order not exist"),/*** 请勿重复提交订单,* 1.当前端遇到该异常时,说明前端防多次点击没做好* 2.提示用户 订单已发生改变,请勿重复下单*/REPEAT_ORDER("A03002", "please don't repeat order"),/*** 订单已过期,当前端看到该状态码的时候,提示订单信息已过期,请重新确认后提交,此时用户点击确定,前端刷新页面。*/ORDER_EXPIRED("A03003", "order expired"),/*** 订单已支付,无法取消订单*/ORDER_PAYED("A03007", "order payed"),/*** 订单未发货,无法确认收货*/ORDER_NO_DELIVERY("A03008", "order no delivery"),/*** 库存不足,body会具体返回那个skuid的库存不足*/NOT_STOCK("A03010", "not stock"),/*** 订单未完成或未关闭,无法删除订单*/ORDER_NOT_FINISH_OR_CLOSE("A03011", "order not finish or close"),/*** 订单未支付*/ORDER_NOT_PAYED("A03012", "order not payed"),/*** 订单已失败*/ORDER_HAS_FAILED("A03013", "order has failed"),/*** 没有查询权限*/REFUND_NOT_PERMISSION("A03024", "refund not permission"),/*** 撤销失败 当前状态不允许此操作*/REFUND_STATUS_CHECK("A03034", "refund status check"),/*** 04 开头代表注册登录之类的异常状态* 社交账号未绑定,当前端看到该异常时,应该在合适的时间(比如在购买的时候跳)根据社交账号的类型,跳转到绑定系统账号的页面*/SOCIAL_ACCOUNT_NOT_BIND("A04001", "social account not bind"),/*** 有些时候第三方系统授权之后,会有个临时的key,比如小程序的session_key* 这个异常代表session_key过期,前端遇到这个问题的时候,应该再次调用社交登录的接口,刷新session_key*/BIZ_TEMP_SESSION_KEY_EXPIRE("A04002", "biz temp session key expire"),/*** 账号未注册,前端看到这个状态码,弹出选择框,提示用户账号未注册,是否进入注册页面,用户选择是,进入注册页面*/ACCOUNT_NOT_REGISTER("A04003", "account not register");private final String code;private final String msg;public String value() {return code;}public String getMsg() {return msg;}ResponseEnum(String code, String msg) {this.code = code;this.msg = msg;}@Overridepublic String toString() {return "ResponseEnum{" + "code='" + code + '\'' + ", msg='" + msg + '\'' + "} " + super.toString();}}

这个是返回状态码的初始化,就是每个接口都会返回状态码的格式

package com.mall4j.cloud.common.response;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.Serializable;
import java.util.Objects;/*** 统一的返回数据** @author FrozenWatermelon* @date 2020/7/3*/
public class ServerResponseEntity<T> implements Serializable {private static final Logger log = LoggerFactory.getLogger(ServerResponseEntity.class);/*** 状态码*/private String code;/*** 信息*/private String msg;/*** 数据*/private T data;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public boolean isSuccess() {return Objects.equals(ResponseEnum.OK.value(), this.code);}@Overridepublic String toString() {return "ServerResponseEntity{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}';}public static <T> ServerResponseEntity<T> success(T data) {ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();serverResponseEntity.setData(data);serverResponseEntity.setCode(ResponseEnum.OK.value());return serverResponseEntity;}public static <T> ServerResponseEntity<T> success() {ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();serverResponseEntity.setCode(ResponseEnum.OK.value());serverResponseEntity.setMsg(ResponseEnum.OK.getMsg());return serverResponseEntity;}/*** 前端显示失败消息* @param msg 失败消息* @return*/public static <T> ServerResponseEntity<T> showFailMsg(String msg) {log.error(msg);ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();serverResponseEntity.setMsg(msg);serverResponseEntity.setCode(ResponseEnum.SHOW_FAIL.value());return serverResponseEntity;}public static <T> ServerResponseEntity<T> fail(ResponseEnum responseEnum) {log.error(responseEnum.toString());ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();serverResponseEntity.setMsg(responseEnum.getMsg());serverResponseEntity.setCode(responseEnum.value());return serverResponseEntity;}public static <T> ServerResponseEntity<T> fail(ResponseEnum responseEnum, T data) {log.error(responseEnum.toString());ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();serverResponseEntity.setMsg(responseEnum.getMsg());serverResponseEntity.setCode(responseEnum.value());serverResponseEntity.setData(data);return serverResponseEntity;}public static <T> ServerResponseEntity<T> transform(ServerResponseEntity<?> oldServerResponseEntity) {ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();serverResponseEntity.setMsg(oldServerResponseEntity.getMsg());serverResponseEntity.setCode(oldServerResponseEntity.getCode());log.error(serverResponseEntity.toString());return serverResponseEntity;}}

接口层会返回固定的格式

后续更新自定义异常处理

码云地址:https://gitee.com/yuisuiWork/spring_project_demo/
欢迎交流,一起进步!

springboot全局异常处理详解相关推荐

  1. SpringBoot统一异常处理详解

    文章目录 一.概述 1.统一异常处理介绍 2.原理和目标 二.Assert(断言) 1.概述 2.Assert自定义实战 2.1 自定义接口Assert 2.2 自定义异常 2.3 Enum整合 2. ...

  2. java框架魔乐_16 魔乐科技 SpringBoot框架开发详解

    资源内容: 16 魔乐科技 SpringBoot框架开发详解|____springboot开发代码.rar|____第一章:SpringBoot入门          |____2. SpringBo ...

  3. SpringBoot 整合EasyExcel详解(一)-高性能Excel方案

    SpringBoot 整合EasyExcel详解(二)-写Excel SpringBoot 整合EasyExcel详解(三)-填充Excel-官方原版 一.概述 Java解析.生成Excel比较有名的 ...

  4. SpringBoot的配置详解application

    SpringBoot的配置文件application有两种文件格式,两种配置的内容是一致的,只是格式不一致. 1.application.properties 2.application.yml或者a ...

  5. springboot+jsp中文乱码_【spring 国际化】springMVC、springboot国际化处理详解

    在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...

  6. creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器

    Spring Boot的配置详解 在本节中,我们将重点聚焦在Spring Boot的配置方面. 理解Spring Boot的自动配置 按照"约定大于配置"的原则,Spring Bo ...

  7. springboot全局异常处理_SpringBoot:如何优雅地处理全局异常

    之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contro ...

  8. 多重句柄怎么处理_golang异常处理详解

    小熊今天有意外收获,忍不住给大家分享我愉快的心情!昨天中午下楼取外卖的时候被一个同事认出来了,他问我:"是不是[编程三分钟]的作者,文章写的不错". 你知道吗!我当时就是一愣,然后 ...

  9. Spring MVC异常处理详解 ExceptionHandler good

    Spring MVC异常处理详解 ExceptionHandler good 参考文章: (1)Spring MVC异常处理详解 ExceptionHandler good (2)https://ww ...

最新文章

  1. python解释器在语法上不支持 编程方式-python解释器在语法上不支持什么编程方式_后端开发...
  2. VMware14黑屏问题
  3. Unix——百度百科
  4. [AtCoder Beginner Contest 216] 题解
  5. 微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项
  6. Android渠道包自动发布市场,Android Gradle实现打包指定渠道后自动上传到fir
  7. 第二十二课php注入,php第二十三节课
  8. 惠普c7000服务器装系统,HP BladeSystem c7000 安装配置手册
  9. 深入ASP.NET 2.0的提供者模型
  10. Glib2: undefined reference to `std::__throw_out_of_range_fmt(char const*, ...)问题(六)
  11. 架构之美-读书笔记之二
  12. cmd 环境下载文件的几种方法
  13. Dialog dismiss 失效的问题,
  14. 2017百度秋招真题笔试之十字架
  15. PostgreSQL 数据库中 DISTINCT 关键字的 4 种用法
  16. 台积电1nm,有新进展
  17. 【Android开发】在Android Studio上关联使用第三方模拟器(MuMu模拟器)调试方法
  18. 用DAB格式快速制作易读宝BNL点读包
  19. 绕过WAF运行命令执行漏洞的方法大全
  20. 阿里云安装redis服务器+入门学习笔记【零基础】【狂神】

热门文章

  1. oracle时间相关函数
  2. DialogInput 字体
  3. i5 10210u和r5 3550h 哪个好
  4. android10 部分机型(华为)无法正常更新安装app
  5. php中excel文件数据的导入和导出
  6. 1601 - 挖胡萝卜
  7. 在excel中用VB对两列数据进行四参数曲线拟合,并输出方程
  8. python随机数列表变成字符串_第五天:python字符串和列表
  9. OpenCV——归一化
  10. 计算机调剂怎么准备复试,2017考研如何做好复试调剂准备