SpringBoot实现自定义异常+全局异常统一处理

目录

前言

一、使用教程

1.自定义异常类。

2.全局统一处理类

3.ResultVO类

4.StatusCodeEnum 枚举类

二、 结束语


前言

        在SpringBoot中,实现自定义异常和全局异常统一处理是确保应用程序稳定性和用户体验的关键。通过定义自定义异常类,我们可以为应用程序中的特定错误提供更具描述性的错误信息。而全局异常统一处理机制,能够确保无论异常发生在何处,都会得到恰当的处理,避免异常的泄露和错误的传播。

一、使用教程

1.自定义异常类。

@Getter
@AllArgsConstructor
public class BusinessException extends RuntimeException implements Serializable{private Integer code= StatusCodeEnum.FAIL.getCode();private String reason;public BusinessException(StatusCodeEnum statusCodeEnum){this.code = statusCodeEnum.getCode();this.reason = statusCodeEnum.getDesc();}public BusinessException(String cause){this.reason = cause;}
}

2.全局统一处理类

       为适应springboot的restFul风格不同的请求和考虑到项目的健壮性,对不同请求的异常制订出了不同的异常处理逻辑。

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler implements Serializable {@ExceptionHandler(BusinessException.class)public ResultVO<?> exception(BusinessException e){return ResultVO.fail(e.getCode(),e.getReason());}/*** 处理Post请求中 使用@requestBody 验证路径中请求实体校验失败后抛出的异常*/@ExceptionHandler(MethodArgumentNotValidException.class)public ResultVO<?> exception(MethodArgumentNotValidException e){String error = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());log.error("{}",error);return ResultVO.fail(error);}/*** 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常*/@ExceptionHandler(BindException.class)@ResponseBodypublic ResultVO<?> BindExceptionHandler(BindException e) {String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());return ResultVO.fail(message);}/*** 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException*/@ExceptionHandler(ConstraintViolationException.class)@ResponseBodypublic ResultVO<?> ConstraintViolationExceptionHandler(ConstraintViolationException e) {String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());return ResultVO.fail(message);}/*** 参数格式异常*/@ExceptionHandler(HttpMessageNotReadableException.class)@ResponseBodypublic ResultVO<?> HttpMessageNotReadableExceptionHandler(HttpMessageNotReadableException e) {return ResultVO.fail("参数格式异常");}
}

3.ResultVO类

        用于封装返回给前端的数据传输类

@Data
@Builder
public class ResultVO<T> {private Boolean flag;private Integer code;private String message;private T data;public static <T> ResultVO<T> ok(){return resultVO(true, StatusCodeEnum.SUCCESS.getCode(), StatusCodeEnum.SUCCESS.getDesc(),null);}public static <T> ResultVO<T> ok(T data){return resultVO(true, StatusCodeEnum.SUCCESS.getCode(), StatusCodeEnum.SUCCESS.getDesc(),data);}public static <T> ResultVO<T> ok(String message){return resultVO(true,message);}public static <T> ResultVO<T> fail(){return resultVO(false, StatusCodeEnum.FAIL.getCode(), StatusCodeEnum.FAIL.getDesc(),null);}public static <T> ResultVO<T> fail(T data){return resultVO(false, StatusCodeEnum.FAIL.getCode(), StatusCodeEnum.FAIL.getDesc(),data);}public static <T> ResultVO<T> fail(String message){return resultVO(false,message);}public static <T> ResultVO<T> fail(Integer code,String message){return resultVO(false,code,message,null);}private static <T> ResultVO<T> resultVO(Boolean flag,String message){return ResultVO.<T>builder().flag(flag).code(flag ? StatusCodeEnum.SUCCESS.getCode(): StatusCodeEnum.FAIL.getCode()).message(message).build();}private static <T> ResultVO<T> resultVO(Boolean flag,Integer code,String message,T data){return ResultVO.<T>builder().flag(flag).code(code).message(message).data(data).build();}
}

4.StatusCodeEnum 枚举类

        使用枚举类避免不必要的冗余。

@AllArgsConstructor
@Getter
public enum StatusCodeEnum {EMAIL_ARGUMENTS_FAIL(4004,"请检查邮箱格式"),MOBILE_ARGUMENTS_FAIL(4005,"请检查手机号格式"),INVALID_PARAMETERS(4006,"参数异常"),ATTACK_LOCK(-5001,"警告!恶意访问"),BLACKLIST(-5002,"恶意操作!账号被禁止"),SUCCESS(20000,"操作成功"),LOGIN_FAILED(40001,"登入失败"),ACCOUNT_EXIST(40003,"账户已存在"),FAIL(50001,"操作失败"),ERROR(50000,"系统异常");private Integer code;private String desc;
}

二、 结束语

        配置完以上的所需要的类后,可以通过postman或者其他接口测试工具进行异常测试,可以通过测试结果来调整返回的提示内容。

        最后希望大家多多支持新人哦~

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

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

相关文章

数据库(MySQL的备份和恢复)

目录 1.1 MySQL 日志管理 1.1.1 MySQL日志类型 1.1.2 错误日志 错误日志中主要记录的几种日志 错误日志的定义 1.1.3 通用查询日志 1.1.4 慢查询日志 和慢查询相关的变量设置 1.1.5 二进制日志 二进制日志是记录执行的语句还是执行后的数据 日志滚动 1.2 MySQL备份…

前端echarts图形报表常见的样式配置

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f415;1.深色主题&#x1f415;2.改变柱状图颜色&#x1f415;突然发现去问ai&#xff0c;更容易理解&#xff0c;那就不总结了 &#x1f412;个人主页 &#x1f3c5;…

scratch——运动积木

一、运动积木概念 在Scratch编程中&#xff0c;运动积木是至关重要的一类积木&#xff0c;它能使我们的角色动起来&#xff01;运动积木是创造动感项目的关键。 二、运动积木的位置 点击左上角的“代码”按钮&#xff0c;然后在界面最左边找到“运动”按钮&#xff0c;这个按…

uniapp复选框 实现排他选项

选择了排他选项之后 复选框其他选项不可以选择 <view class"reportData" v-for"(val, index) in obj" :key"index"> <view v-if"val.type 3" ><u-checkbox-group v-model"optionValue" placement"colu…

数据结构顺序表力扣例题AC——代码以及思路记录

顺序表力扣例题 27.移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

arm 汇编调用C

arm64 汇编调用C函数 main.s .section .text .globl main main:stp x29, x30, [sp, -16]! //store fp x29 lr x30mov x0, #0mov x1, #1bl addmov x1, x0 // x0 return ldp x29, x30, [sp], 16 //restore fp lrretadd.c #include <stdio.h> int add(int a, int…

go使用docker sdk停止和删除docker

go使用docker sdk停止和删除docker 代码参考 代码 package mainimport ("context""fmt""github.com/docker/cli/cli/connhelper""github.com/docker/docker/api/types/container""github.com/docker/docker/client""n…

性能优化-HVX 指令介绍

「发表于知乎专栏《移动端算法优化》」 本文主要介绍了 HVX 指令相关的知识&#xff0c;包括 HVX 寄存器相关内容&#xff0c;指令的背景依赖&#xff0c;部分常用 intrinsic HVX 指令。具体指令的详细内容及使用还需阅读 HVX 的指令文档&#xff0c;以及细致的实践操作。 &…

【node】关于npm、yarn、npx的区别与使用

文章目录 npm (Node Package Manager):安装依赖运行脚本 npx:执行项目依赖中的命令 yarn:安装依赖eg.使用npx yarn install 的作用 npm (Node Package Manager): 用途&#xff1a; npm 是 Node.js 官方提供的包管理工具&#xff0c;用于安装、管理和分享 JavaScript 代码包。安…

C语言—fopen和ab+

在C语言中&#xff0c;fopen(“data”,“ab”) 是使用 fopen 函数以追加和读写模式打开一个名为 “data” 的文件的方法。 下面是对这个函数调用的各个部分的解释&#xff1a; fopen 函数 fopen 是一个标准库函数&#xff0c;用于打开文件。它的原型定义在 <stdio.h> 头…

库函数的模拟实现

目录 模拟实现strlen 模拟实现strcpy 模拟实现strcmp 模拟实现strcat 模拟实现strstr 模拟实现memcpy 模拟实现memmove 模拟实现strlen #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int MyStrlen(char* str) {int len 0;while (str[len] ! \0)len;retu…

GitLab升级版本(任意用户密码重置漏洞CVE-2023-7028)

目录 前言漏洞分析影响范围查看自己的GitLab版本升级路程 升级过程13.1.1113.8.8 - 14.0.1214.3.614.9.5 - 16.1.6 前言 最近GitLab发了个紧急漏洞需要修复&#xff0c;ok接到命令立刻着手开始修复&#xff0c;在修复之前先大概了解一下这个漏洞是什么东西 漏洞分析 1、组件…

单点登陆(SSO)基于CAS实现前后端分离的SSO系统开发「IDP发起」

关于其他前端常见登录实现单点登录方案&#xff0c;请见「前端常见登录实现方案 单点登录方案 」 前沿 单点登录&#xff08;SSO&#xff09;&#xff0c;英文全称为 Single Sign On。 SSO 是指在多个应用系统中&#xff0c;用户只需要登录一次&#xff0c;就可以访问所有相互…

redis-持久化-1

Redis 提供了2个不同形式的持久化方式。 RDB&#xff08;Redis DataBase&#xff09; AOF&#xff08;Append Of File&#xff09; 一、Redis持久化之RDB 1.什么是RDB 在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c; 也就是行话讲的Snapshot快照&#xff0c…

puppeteer实现截图

Window服务器说明 1.在本地安装 puppeteer 先创建一个本地文件夹puppeteer&#xff0c;我的地址D:\common_workspace\puppeteer 然后使用cmd打开这个文件夹所在位置&#xff0c;再执行如下两条命令即可。 npm install -g cnpm --registryhttps://registry.npm.taobao.orgcnpm …

剖析EasyExcel导入出现 The index of ‘xx‘ and ‘xx‘ must be inconsistent 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在导出Excel的时候,出现如下问题: com.alibaba.excel.exception.ExcelCommonException: The index of tyreNumber and remark must be inconsistentat com.alibaba.exce

为什么需要数据仓库

为什么不在OLTP环境下分析&#xff1f; OLTP环境也会存储历史数据&#xff0c;但这些历史数据并不是业务运行所需的&#xff0c;这些历史数据需要经常归档到数据仓库&#xff0c;并且在OLTP数据库中删除。 相比之下&#xff0c;事务环境适用于连续处理事务&#xff0c;通常应…

搭建通讯猫类似的TCP服务端

最近需要一个公网的TCP服务端平台来做4G模组的发包测验&#xff0c;通讯猫(http://www.tongxinmao.com/App/Detail/id/1)貌似使用不了&#xff0c;就干脆在自己的腾讯云上搭建了简单的TCP服务端。 我们搭建可以在服务器上使用Python、Java、C#等语言自行编写服务器程序。 目前是…

KADB使用PXF连接KES验证

验证环境 KADB版本&#xff1a;Greenplum Database 6.0.0 build dev.V003R002C001B0181.d354cc9215 KES版本&#xff1a;KingbaseES V008R006C007B0012 Java版本&#xff1a;openjdk version "1.8.0_262" PXF部署 以下操作假设KADB和KES已经部署完成并且启动正常…

nomachine下载安装使用教程(远程桌面)

文章目录 参考链接 nomachine 参考链接 [1]【远程桌面】nomachine下载安装使用教程、zerotier下载安装使用教程超详细&#xff1a;https://blog.csdn.net/weixin_44029896/article/details/128555481 [2] 树莓派开发之旅&#xff08;一&#xff09;——使用Nomachine进行远…