【Spring Boot】实现全局异常处理

1.定义基础异常接口类

/*** @description: 服务接口类* @author: MrVK* @date: 2021/4/19 21:39*/
public interface BaseErrorInfoInterface {/***  错误码* @return*/String getResultCode();/*** 错误描述* @return*/String getResultMsg();
}

2.定义错误处理枚举类

/*** @description: 异常处理枚举类* @author: MrVK* @date: 2021/4/19 21:41* @version: v1.0*/
public enum ExceptionEnum implements BaseErrorInfoInterface{// 数据操作错误定义SUCCESS("2000", "成功!"),BODY_NOT_MATCH("4000","请求的数据格式不符!"),SIGNATURE_NOT_MATCH("4001","请求的数字签名不匹配!"),NOT_FOUND("4004", "未找到该资源!"),INTERNAL_SERVER_ERROR("5000", "服务器内部错误!"),SERVER_BUSY("5003","服务器正忙,请稍后再试!");/*** 错误码*/private final String resultCode;/*** 错误描述*/private final String resultMsg;ExceptionEnum(String resultCode, String resultMsg) {this.resultCode = resultCode;this.resultMsg = resultMsg;}@Overridepublic String getResultCode() {return resultCode;}@Overridepublic String getResultMsg() {return resultMsg;}
}

3.自定义异常类

/*** @description: 自定义异常类* @author: MrVK* @date: 2021/4/19 21:44* @version: v1.0*/
public class BizException extends RuntimeException{private static final long serialVersionUID = 1L;/*** 错误码*/protected String errorCode;/*** 错误信息*/protected String errorMsg;public BizException() {super();}public BizException(BaseErrorInfoInterface errorInfoInterface) {super(errorInfoInterface.getResultCode());this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {super(errorInfoInterface.getResultCode(), cause);this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(String errorMsg) {super(errorMsg);this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg) {super(errorCode);this.errorCode = errorCode;this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg, Throwable cause) {super(errorCode, cause);this.errorCode = errorCode;this.errorMsg = errorMsg;}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}@Overridepublic Throwable fillInStackTrace() {return this;}
}

4.自定义响应体类

/*** @description: 自定义数据传输* @author: MrVK* @date: 2021/4/19 21:47* @version: v1.0*/
public class ResultResponse {/*** 响应代码*/private String code;/*** 响应消息*/private String message;/*** 响应结果*/private Object result;public ResultResponse() {}public ResultResponse(BaseErrorInfoInterface errorInfo) {this.code = errorInfo.getResultCode();this.message = errorInfo.getResultMsg();}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getResult() {return result;}public void setResult(Object result) {this.result = result;}/*** 成功** @return*/public static ResultResponse success() {return success(null);}/*** 成功* @param data* @return*/public static ResultResponse success(Object data) {ResultResponse rb = new ResultResponse();rb.setCode(ExceptionEnum.SUCCESS.getResultCode());rb.setMessage(ExceptionEnum.SUCCESS.getResultMsg());rb.setResult(data);return rb;}/*** 失败*/public static ResultResponse error(BaseErrorInfoInterface errorInfo) {ResultResponse rb = new ResultResponse();rb.setCode(errorInfo.getResultCode());rb.setMessage(errorInfo.getResultMsg());rb.setResult(null);return rb;}/*** 失败*/public static ResultResponse error(String code, String message) {ResultResponse rb = new ResultResponse();rb.setCode(code);rb.setMessage(message);rb.setResult(null);return rb;}/*** 失败*/public static ResultResponse error( String message) {ResultResponse rb = new ResultResponse();rb.setCode("-1");rb.setMessage(message);rb.setResult(null);return rb;}@Overridepublic String toString() {return JSONObject.toJSONString(this);}}

5.自定义全局异常处理

/*** @description: 自定义异常处理* @author: MrVK* @date: 2021/4/19 21:51* @version: v1.0*/
@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理自定义的业务异常* @param req* @param e* @return*/@ExceptionHandler(value = BizException.class)@ResponseBodypublic ResultResponse bizExceptionHandler(HttpServletRequest req, BizException e){logger.error("发生业务异常!原因是:{}",e.getErrorMsg());return ResultResponse.error(e.getErrorCode(),e.getErrorMsg());}/*** 处理空指针的异常* @param req* @param e* @return*/@ExceptionHandler(value =NullPointerException.class)@ResponseBodypublic ResultResponse exceptionHandler(HttpServletRequest req, NullPointerException e){logger.error("发生空指针异常!原因是:",e);return ResultResponse.error(ExceptionEnum.BODY_NOT_MATCH);}/*** 处理其他异常* @param req* @param e* @return*/@ExceptionHandler(value =Exception.class)@ResponseBodypublic ResultResponse exceptionHandler(HttpServletRequest req, Exception e){logger.error("未知异常!原因是:",e);return ResultResponse.error(ExceptionEnum.INTERNAL_SERVER_ERROR);}
}

6.测试代码

@PostMapping("/add")
public boolean add(@RequestBody User user) {//如果姓名为空就手动抛出一个自定义的异常!if(user.getName()==null){throw  new BizException("-1","用户姓名不能为空!");}return true;
}@PutMapping("/update")
public boolean update(@RequestBody User user) {//这里故意造成一个空指针的异常,并且不进行处理String str = null;str.equals("111");return true;
}@DeleteMapping("/delete")
public boolean delete(@RequestBody User user)  {//这里故意造成一个异常,并且不进行处理Integer.parseInt("abc123");return true;
}@GetMapping("/error")
@ExceptionHandler(value = NumberFormatException.class)
@ResponseBody
public ResultResponse exceptionHandler(HttpServletRequest req, NumberFormatException e){logger.error("发生类型转换异常!原因是:",e);return ResultResponse.error(ExceptionEnum.PARAMS_NOT_CONVERT);
}

7.测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小伙伴询问AI该怎么学习?本人的一点总结,以思维导图呈现

如有需要思维导图的在后台请留邮箱,相关知识结构目录 部分导图

nn.Linear() 使用提醒

原本以为它是和nn.Conv2d()一样,就看第二个维度的数值,今天才知道,它是只看最后一个维度的数值!!! 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…

git使用merge命令把dev分支的mian.js文件和src下面的vuex文件夹以及config文件夹单独合并到master分支上

使用 git merge 命令来单独合并特定文件或文件夹到另一个分支通常不是最直接的方法,因为 merge 命令是用来合并两个分支的所有更改的。然而,你可以通过 git cherry-pick 命令或者通过创建临时补丁(patch)来实现这一点。 下面是一个…

秒杀的时候怎么使用Redis?

商品信息存储:在Redis中存储秒杀商品的库存信息。可以使用Redis的Hash数据类型,将商品ID作为字段,库存数量作为值存储在Hash中。例如,HSET seckill_goods stock_1 100表示商品ID为stock_1的商品库存数量为100。 秒杀订单存储&…

如何使用“Ubuntu 20.04桌面版,安装MariaDB数据库“?win10系统?

1、更新软件包 sudo apt update 2、 安装MariaDB服务器和客户端 sudo apt install mariadb-server mariadb-client 3、 查看MeriaDB是否运行 service mysql status :q"退回命令行状态 4、 设置MariaDB root用户的密码 sudo mysql_secure_installation 5、 MariaD…

斐波那契数列模型----三步问题

面试题 08.01. 三步问题 - 力扣(LeetCode) 1、状态表示: 题目要求:上到n阶台阶,有多少种方法。那么n逐渐简化,上1阶台阶有多少种方法;上2阶台阶有多少种方法……直到上n阶台阶有多少种方法。 …

c++ [[nodiscard]]关键字详解

如果一个函数声明了[[nodiscard]],则该函数的返回值不能没有承接,如果没有承接,就会编译报warning [[nodiscard]]是c17新特性,但本地用c11标准编译也能编译过,尚不清楚原因,c20加入了warning后的额外文字描…

代码随想录第45天|● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

文章目录 ● 70. 爬楼梯 (进阶)思路:- 排列 先value后weight代码: ● 322. 零钱兑换思路:代码 ● 279.完全平方数思路:代码 ● 70. 爬楼梯 (进阶) 思路:- 排列 先value后…

如何提升计算机性能

04 穿越功耗墙,我们该从哪些方面提升“性能”? 上一讲,在讲 CPU 的性能时,我们提到了这样一个公式: 程序的 CPU 执行时间 指令数CPIClock Cycle Time 这么来看,如果要提升计算机的性能,我们可以…

zookeeper框架

事务ID Znode的创建删除,更改内容等都是作为zookeeper的事务进行执行的。 对于每一个事务请求,zookeeper都会为其分配一个全局唯一的事务ID,从ID可以识别出事务的全局顺序。 节点特性 czxid:create zxid,数据节点创建时的事务ID mzxid&…

基于ZYNQ的PCIE高速数据采集卡的设计(一)

作为信息处理的第一步,数据采集的作用越来越重要。目前,数据采集已经在航 空、民用、军事、医疗等领域得到广泛应用。随着相关技术的不断发展,信号频率越 来高,带宽越来越大,使得数据采集技术逐渐向高速大数据的方向…

【python】优化docker镜像体积

背景 测试脚本的最终所构成的镜像体积偏大,项目提出整改 实现思路 1.测试基础镜像,更换为更小的 参见:python 多阶段构建docker镜像,有效减少镜像大小 - 知乎 2.去掉实际未使用的依赖库

幻兽帕鲁专用服务器搭建之Linux部署配置教程

大家好我是飞飞,上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求,很多小伙伴就寻思用Linux系统搭建占用会不会小一点?有计算机基础的小伙伴都知道Linux系统和Windows系统相比,…

【Linux】实时查看服务器信息

查看服务器CPU使用率 使用命令mpstat 1。这里的1表示每隔1秒更新一次CPU使用率。如果系统未安装mpstat,可以通过安装sysstat包来获取它。 在基于Debian的系统(如Ubuntu)上,使用命令: sudo apt-get update sudo apt-…

JavaScript 数据类型详解的教程

在JavaScript中,数据类型是非常重要的概念,了解数据类型有助于我们更好地操作数据以及编写高效的代码。本教程将详细介绍JavaScript中的各种数据类型,包括基本数据类型和复杂数据类型。 基本数据类型 1. 数值(Number) 在JavaScript中&…

考研复试类比社团招新,无所谓“公平”,导师选谁都是他的权力

这篇文章是抖音和b站上上传的同名视频的原文稿件,感兴趣的csdn用户可以关注我的抖音和b站账号(GeekPower极客力量)。同时这篇文章也为视频观众提供方便,可以更加冷静地分析和思考。文章同时在知乎发表。 我考研一战的时候计算机考…

MySQL 主从复制配置指南

MySQL 主从复制配置指南 MySQL主从复制允许数据从一个MySQL数据库服务器(主服务器)复制到一个或多个MySQL数据库服务器(从服务器)。这是一种常用的数据冗余和备份方法,也可以用于负载均衡。 前提条件 主服务器和从服…

【详识JAVA语言】面向对象程序三大特性之一:封装

封装的概念 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说 就是套壳屏蔽细节。 比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通…

飞桨模型转ONNX模型教程

文章目录 飞桨模型转ONNX模型教程1. ONNX简介2. Paddle2ONNX安装3. 获取Paddle2ONNX模型库4. 飞桨转ONNX教程4.1 飞桨训练模型导出为ONNX模型4.2 飞桨部署模型转为ONNX模型4.3 验证ONNX模型4.4 使用ONNX模型进行推理 5. 注意事项 飞桨模型转ONNX模型教程 1. ONNX简介 ONNX是一…

管理系统提升:列表页构成要素,拒绝千篇一律

大家伙,我是大千UI工场,专注UI知识案例分享和接单,本期带来B端系统列表页的分享,欢迎大家关注、互动交流。 一、什么是列表页 管理系统列表页是指管理系统中用于展示和管理数据的页面,通常以表格或列表的形式呈现。列…