SpringBoot中实现全局异常处理,统一返回错误信息给前端

news2024/9/20 7:46:31

背景引入:最近实现了一个限流切面类,但是在限流方法中throw异常,会直接打印到控制台,报错500,对前端很不友好。因为是注解,又没办法捕获再处理。那么怎么才能将错误码返回给前端呢?原来是全局异常处理……

切面方法:

@Before(value = "AccessLimitPointcut()")
    public void handleAccessLimit(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        RateLimiter annotation = AnnotationUtils.findAnnotation(method, RateLimiter.class);
        int accessMaxTimes = annotation.count();
        long timeOut = annotation.time();
        TimeUnit timeUnit = annotation.timeUnit();
        String key = annotation.key();
        // 如果redis不存在或已经过期
        Long expire = redisTemplate.opsForValue().getOperations().getExpire(key);
        if (!redisTemplate.hasKey(key) || Objects.requireNonNull(expire).intValue() < 0) {
            redisTemplate.opsForValue().set(key, 1, timeOut, timeUnit);
        } else {
            long increment = redisTemplate.opsForValue().increment(key).intValue();
            if (increment > accessMaxTimes) {
                throw new AIDocException("PA-COM-000001", "访问已经超过最大值: " + accessMaxTimes);
            }
        }
    }

如果没有引入全局异常处理,那么异常会直接展示在控制台

如何实现:用@RestControllerAdvice和@ExceptionHandler注解在SpringBoot中实现全局异常处理

1、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。
2、@RestControllerAdvice 是组件注解,他使得其实现类能够被classpath扫描自动发现,如果应用是通过MVC命令空间或MVC Java编程方式配置,那么该特性默认是自动开启的。

@RestControllerAdvice
public class AIDocExceptionHandler {
	
	private Logger logger = LoggerFactory.getLogger(AIDocExceptionHandler.class);

	/**
	 * 处理自定义异常
	 */
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public Map<String, Object> handleRRException(Exception e) {
		Map<String, Object> map = new HashMap<>();
		if (e instanceof AIDocException) {
			map.put("code",((AIDocException) e).getCode());
			map.put("msg", ((AIDocException) e).getMsg());
		}else {
			logger.error("【系统异常】{}", e);
			map.put("code", ErrorConstants.INVOKE_FAIL);
			map.put("msg","未知异常!");
		}
		return map;
	}
}

其中AIDocException是自定义异常类,你可以根据你的需求编写自己的自定义异常类。

以上就实现了全局统一异常管理,是不是很简单?

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

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

相关文章

linux下的Socket网络编程教程

套接字概念 Socket本身有“插座”的意思&#xff0c;在Linux环境下&#xff0c;用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。与管道类似的&#xff0c;Linux系统将其封装成文件的目的是为了统一接口&#xff0c;使得读写套接字和读写文件的操作…

什么是边缘计算?边缘计算网关有什么作用?

边缘计算是一种分布式计算范式&#xff0c;它将计算、存储和网络服务靠近数据源或用户的位置&#xff0c;以减少延迟、提高响应速度&#xff0c;并减轻中心数据中心的负担。边缘计算网关在这一过程中扮演着至关重要的角色。边缘计算网关的主要作用包括&#xff1a;1. 数据的收集…

问题合集更更更之cssnano配置导致打包重新计算z-index

前言 &#x1f44f;问题合集更更更之cssnano配置导致打包重新计算z-index~ &#x1f947;记得点赞关注收藏&#xff01; 1.问题描述 代码中写了样式代码&#xff0c;z-index层级关系 z-index&#xff1a;2029;进行打包之后&#xff0c;发布到环境中&#xff0c;发现层级变…

《机器学习》PCA数据降维 推导、参数讲解、代码演示及分析

目录 一、主成分分析 1、什么是主成分分析&#xff1f; 2、什么是降维&#xff1f; 3、如何进行主成分分析 1&#xff09;数据标准化 2&#xff09;计算协方差矩阵 3&#xff09;计算特征值和特征向量 4&#xff09;选择主成分 5&#xff09;构建投影矩阵 6&#xff09;数据…

中学理化生实验室如何建设及配置

近年来&#xff0c;各地教育部门陆续出台“关于推进普通中小学校科学类实验室建设”的相关要求&#xff0c;针对小学、初中、高中学段的实验室等设施设备配备提出了标准指引&#xff0c;提升教育装备水平&#xff0c;助力打造品质教育。本文就中学理化生实验室建设要求及配置进…

【ant-design】Table如何设置Empty文案并保留图标

如果只设置了文案&#xff0c;那么为空的时候&#xff0c;并不会有图标 这时候我们可以设置emptyText: <Empty image{Empty.PRESENTED_IMAGE_SIMPLE} description{"没有数据"}/> 即可保留图标

产品经理入门基础

什么是产品&#xff1f; 什么是产品经理&#xff1f; 想清楚产品怎么做的人 1.什么是产品?区别是? 能够解决某个问题的东西就是产品有形的产品、无形的产品2.什么是产品经理? 想清楚产品怎么做的人就是产品经理3.合格的产品经理需要关注哪些核心问题? 用户、场景、需求功能…

k8s工作负载控制器--Statefulset

文章目录 一、概述二、引入"有状态"需求1、管理无状态服务的 Deployment 实现了什么1.1、创建 Deployment1.2、验证 Pod 数量1.3、配置更新策略&#xff08;更新镜像版本&#xff09;1.4、观察更新过程1.5、验证更新后 Pod 的状态1.6、回滚 Deployment 2、新需求分析…

iptable 理解

iptable 理解 这个当初我理解不了&#xff0c;主要是没把netfilter理解清楚。 Netfilter是集成在内核中的&#xff0c;用来定义存储各种规则的。Iptalbe是修改这些规则的工具&#xff0c;修改后存在netfilter里面。 数据包进入LINUX服务器时&#xff0c;先进入服务器的netfilt…

Leetcode 72. 编辑距离 动态规划 优化 C++实现

Leetcode 72.编辑距离 问题&#xff1a;给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a;插入一个字符&#xff0c;删除一个字符&#xff0c;替换一个字符。 算法1&#xff1a;递…

9-6springboot该如何学习

这阶段如何学习 javase&#xff1a;面向对象OOP mysql:持久化 htmlcssjsjquery框架&#xff1a;视图&#xff08;框架不熟练&#xff09;&#xff0c;css不好 javaweb&#xff1a;独立开发MVC三层架构的网站&#xff1a;原始 ssm&#xff1a;框架&#xff1a;简化了我们的…

【课程学习】信号检测与估计

文章目录 3.7-CRB延展到向量的形式3.8-参数变换形式的CRB CRB for transformation, pp45-463.9-高斯分布 CRLB for the General Gaussian Case3.7-CRB延展到向量的形式 0904 向量和变换形式的CRLB形式 估计参数真实值 θ \theta θ,估计值 θ ^ \hat \theta θ^ 与信号与系统…

AcWing算法基础课-786第k个数-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》786 题——第 k 个数。本篇文章详细解析了如何使用 Java 实现快速排序算法&#xff0c;以解决查找数组中第 k 个元素的问题。通过深入浅出的讲解&#xff0c;展示了从输入读取到快速排序实现的…

Java程序打jar包(包含作者各种踩坑案例,力求为大家避雷)

一、诉求 将一个spring boot项目打包成一个jar包&#xff0c;直接在windows或者linux系统下直接命令行运行。 二、配置步骤 1、编写assembly.xml配置文件&#xff08;放在pom.xml同级目录&#xff09; <?xml version"1.0"?> <assembly><id>T…

GAN生成器好坏之评价方法

我们产生出来的生成器它好或者是不好。要 评估一个生成器的好坏&#xff0c;最直觉的做法也许是找人来看生成器产生出来的图片到底像不像真 实的图片。所以其实很长一段时间&#xff0c;尤其是人们刚开始研究生成式技术的时候&#xff0c;很长一段时间 没有好的评估方法。那时候…

群晖NAS安装(一)

主要教程参考 https://zhuanlan.zhihu.com/p/515187738?utm_id0&wd&eqide69f50bb0000263900000006645b5680 系统是DS3617xs DSM6.1.3 一 准备工作 旧16G U盘一个 软件: diskgenius 分区工具 win32diskimager 写入工具 chipeasy或者chipgenius 识别工具 二 安装 分区…

log4j2 与 log4j使用时的几点小区别 - log4j2上手说明

虽然log4j2 目前还是beta版&#xff0c;不过OneCoder已经忍不住要尝试一下。跟使用log4j 比起来&#xff0c;上手上主要的区别有。 1、依赖的jar包。使用slf4jlog4j2 时&#xff0c;依赖的jar包如下&#xff1a;( gradle配置&#xff0c;Maven对照修改即可) dependencies{ com…

SAP与湃睿PLM系统集成案例

一、项目背景 浙江某家用电机有限公司, 该公司的产品涵盖洗衣机、‌空调、‌冰箱及厨房用具等家电电机的制造&#xff0c;‌具备年产4600万台电机的生产能力&#xff0c;‌是中国最大的家电电机生产基地之一。 为确保工艺路线信息在设计与生产执行层面的无缝传递&#xff0…

python多进程

文章目录 1、前言2、示例3、参考 1、前言 python中使用多进程&#xff0c;可以加快代码的运行速度&#xff0c;更高效地进行相关工作。 2、示例 使用蒙特卡洛方法计算 π \pi π来进行使用多进程前后代码运行速率的对比&#xff1b; import random import multiprocessing as…

信也科技基于 Apache SeaTunnel金融场景的应用实践探索

前言 作者&#xff1a;朱俊&#xff0c;信也科技&#xff0c;数据开发专家 离线开发一直是数据仓库建设中重要的一个环节。信也科技之前基于Azkaban构建了离线任务调度与开发平台&#xff0c;承载了公司90%以上的离线任务调度需求&#xff0c;以及玄策变量平台的每日变量跑批产…