springboot全局异常处理详解
对于全局异常需要认识两个注解
@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全局异常处理详解相关推荐
- SpringBoot统一异常处理详解
文章目录 一.概述 1.统一异常处理介绍 2.原理和目标 二.Assert(断言) 1.概述 2.Assert自定义实战 2.1 自定义接口Assert 2.2 自定义异常 2.3 Enum整合 2. ...
- java框架魔乐_16 魔乐科技 SpringBoot框架开发详解
资源内容: 16 魔乐科技 SpringBoot框架开发详解|____springboot开发代码.rar|____第一章:SpringBoot入门 |____2. SpringBo ...
- SpringBoot 整合EasyExcel详解(一)-高性能Excel方案
SpringBoot 整合EasyExcel详解(二)-写Excel SpringBoot 整合EasyExcel详解(三)-填充Excel-官方原版 一.概述 Java解析.生成Excel比较有名的 ...
- SpringBoot的配置详解application
SpringBoot的配置文件application有两种文件格式,两种配置的内容是一致的,只是格式不一致. 1.application.properties 2.application.yml或者a ...
- springboot+jsp中文乱码_【spring 国际化】springMVC、springboot国际化处理详解
在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...
- creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器
Spring Boot的配置详解 在本节中,我们将重点聚焦在Spring Boot的配置方面. 理解Spring Boot的自动配置 按照"约定大于配置"的原则,Spring Bo ...
- springboot全局异常处理_SpringBoot:如何优雅地处理全局异常
之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contro ...
- 多重句柄怎么处理_golang异常处理详解
小熊今天有意外收获,忍不住给大家分享我愉快的心情!昨天中午下楼取外卖的时候被一个同事认出来了,他问我:"是不是[编程三分钟]的作者,文章写的不错". 你知道吗!我当时就是一愣,然后 ...
- Spring MVC异常处理详解 ExceptionHandler good
Spring MVC异常处理详解 ExceptionHandler good 参考文章: (1)Spring MVC异常处理详解 ExceptionHandler good (2)https://ww ...
最新文章
- python解释器在语法上不支持 编程方式-python解释器在语法上不支持什么编程方式_后端开发...
- VMware14黑屏问题
- Unix——百度百科
- [AtCoder Beginner Contest 216] 题解
- 微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项
- Android渠道包自动发布市场,Android Gradle实现打包指定渠道后自动上传到fir
- 第二十二课php注入,php第二十三节课
- 惠普c7000服务器装系统,HP BladeSystem c7000 安装配置手册
- 深入ASP.NET 2.0的提供者模型
- Glib2: undefined reference to `std::__throw_out_of_range_fmt(char const*, ...)问题(六)
- 架构之美-读书笔记之二
- cmd 环境下载文件的几种方法
- Dialog dismiss 失效的问题,
- 2017百度秋招真题笔试之十字架
- PostgreSQL 数据库中 DISTINCT 关键字的 4 种用法
- 台积电1nm,有新进展
- 【Android开发】在Android Studio上关联使用第三方模拟器(MuMu模拟器)调试方法
- 用DAB格式快速制作易读宝BNL点读包
- 绕过WAF运行命令执行漏洞的方法大全
- 阿里云安装redis服务器+入门学习笔记【零基础】【狂神】