使用spring boot实现异常的统一返回

在这个前后端分离的时代,一个 统一的数据格式非常重要。本次我们实现用spring boot实现一下返回给前端数据的统一格式,不再出现服务器500的错误。

新建一个spring boot项目,并导入knife4j的依赖。

写一个controller控制器,用来是实现测试http的请求

@RestController
public class TestController {@GetMapping("/test")
public  String test(){
int i=1/0;return "一个test测试请求";
}
}

发送请求测试:

异常的统一主要依赖于两个注解:
@ControllerAdvice:

Controller增强器,给controller层增加统一的操作和处理

@ExceptionHander

捕获controller抛出的异常,并进行处理;

自定义异常处理:

1、自定义一个类Result,用来实现返回给前端的统一格式:
 

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> implements Serializable {private static final long serialVersionUID = 1L;
private Integer code;
private String message;
private T data;
}

2、创建一个类ResultException,继承RuntimeException异常

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultException extends RuntimeException{private Integer code;private String message;
}

3、创建一个VoResultException 类,用来实现具体的逻辑:

@RestControllerAdvice
public class VoResultException {//    自定义异常处理类
@ExceptionHandler(ResultException.class)
public Result errorResult(ResultException resultException){
return new Result(resultException.getCode(),resultException.getMessage(),null);
}}

@RestControllerAdvice注解是@ControllerAdvice和@ResponseBody注解的结合,标识返回的数据是json类型

至此,我们就实现了全部的工作。现在,在你想要抛出异常的地方直接使用即可(直接抛出ResultException异常)

@GetMapping("/test")
public  String test(){throw new ResultException(10001,"测试异常");}

发送请求测试:

可以返回了统一的数据,但是这个异常是我们自定义的。所以不能处理程序中的错误

如下图这个错误:

@GetMapping("/test")
public  String test(){int i=1/0;throw new ResultException(10001,"测试异常");}

测试请求:

由于这个异常是在程序运行中出现的,属于RunException异常,我们自定义的异常不能够捕获到。      这时,我们可以在自定义的异常处理器VoResultException类中再加入全局异常处理器。

如下所示:

@RestControllerAdvice
public class VoResultException {
//    自定义异常处理类
@ExceptionHandler(ResultException.class)
public Result errorResult(ResultException resultException){
return new Result(resultException.getCode(),resultException.getMessage(),null);
}//全局异常处理类@ExceptionHandler(Exception.class)public Result error(Exception e){return new Result(1001,e.getMessage(),null);}}

加入了全局异常处理时,抛出的RunException异常就可以自动捕获了。

小插曲:

@ExceptionHandler(ResultException.class)注解里面是要捕获的异常的类型,下面的方法参数中也一定要传入与这个类型一样的类队象  或者   满足继承关系(这一点是非常重要的,不然它不能自动捕获异常)

我们再发一次请求:

可以看到by zero这个异常被自动捕获了。

我们在正常的后端开发中也是这样搞得:

一般我们定义两个@ExceptionHandler。

一个是自定义异常,用来在项目中抛出我们自定义的异常(由于这个自定义的异常是继承RunException得来的,所以不能处理项目在运行时的异常,只能手动抛出,也就是我们已经预先知道的异常)

一个是全局异常,用来捕获我们在项目中遇到的其他异常。可以这样说,除了我们手动抛出的自定义异常,其他的都需要全局异常来捕获并抛出。但是全局异常的表达并不能像我们自定义的异常一样清晰,这个是虚拟机自动抛出的。

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

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

相关文章

maven中dependencyManagement标签

简介 dependencyManagement正如其名&#xff0c;用于项目依赖的统一管理。 在父项目中的pom.xml文件中加入dependencyManagement标签即可完成依赖版本的声明。在声明完成后&#xff0c;子项目&#xff08;module&#xff09;中引用相同的依赖时可以不指定version标签自动引入…

<软考高项备考>《论文专题 - 33 沟通管理(1) 》

1 成本管理基础 1.1 写作要点 过程定义、作用写作要点、思路规划沟通管理规划沟通管理是基于每个干系人或干系人群体的信息需求、可用的组织资产&#xff0c;以及具体项目的需求&#xff0c;为项目沟通活动制定恰当的方法和计划的过程。作用:①及时向干系人提供相关信息;②引…

Bert-vits2-2.3-Final,Bert-vits2最终版一键整合包(复刻生化危机艾达王)

近日&#xff0c;Bert-vits2发布了最新的版本2.3-final&#xff0c;意为最终版&#xff0c;修复了一些已知的bug&#xff0c;添加基于 WavLM 的 Discriminator&#xff08;来源于 StyleTTS2&#xff09;&#xff0c;令人意外的是&#xff0c;因情感控制效果不佳&#xff0c;去除…

有道翻译web端 爬虫, js

以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…

在matlab中对hsv进行均匀量化和非均匀量化

首先&#xff0c;进行非均匀量化&#xff0c;H,S,V三通道分别量化为16,4,4级&#xff0c;返回一个向量。量化依据如下表&#xff1a; function vec getHsvHist(Image) [M,N,O] size(Image); if O~ 3error(3 components are needed for histogram); end [h,s,v] rgb2hsv(Imag…

GoLand for mac 2023.3.2 Go语言开发集成环境

GoLand 是 JetBrains 公司开发的一款专业的 Go 语言集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多强大的功能来提高 Go 语言开发者的生产力和代码质量。 一、概述 GoLand 是基于 IntelliJ 平台构建的&#xff0c;继承了 IntelliJ IDEA 的强大功能和稳定性…

【ES】Elasticsearch常见问题与解决(持续更新)

目录 Elasticsearch常见问题 1. 集群健康问题 2. 性能问题 3. 映射问题 4. 分片问题 5. 内存问题 6. 硬件问题 7. 配置问题 8. 安全问题 9. 网络问题 10. 版本不兼容 Elasticsearch日常使用小结 【Q】离线告警&#xff0c;有IP已离线 【Q】统计某个应用的某个索引…

小梅哥Xilinx FPGA学习笔记16——FSM(状态机)的学习

目录 一、 状态机导读 1.1 理论学习 1.2 状态机的表示 1.3 状态机编码 1.4 状态机描述方式 二 、实战演练一&#xff08;来自野火&#xff09; 2.1 实验目标 2.2 模块框图 2.3 状态转移图绘制 2.4 设计文件 2.5 仿真测试文件 2.6 仿真结果 三、 实战演练二&…

LLM之RAG实战(九)| 高级RAG 03:多文档RAG体系结构

在RAG&#xff08;检索和生成&#xff09;这样的框架内管理和处理多个文档有很大的挑战。关键不仅在于提取相关内容&#xff0c;还在于选择包含用户查询所寻求的信息的适当文档。基于用户查询对齐的多粒度特性&#xff0c;需要动态选择文档&#xff0c;本文将介绍结构化层次检索…

【SpringBoot】第2章 SpringBoot核心配置与注解

学习目标 熟悉SpringBoot全局配置文件的使用 熟悉SpringBoot自定义配置 掌握SpringBoot配置文件属性值注入 掌握Profile多环境配置 了解随机值设置以及参数间引用 2.1 全局配置文件 全局配置文件能够对一些默认配置进行修改。SpringBoot使用一个application.properties…

王道考研计算机网络——应用层

如何为用户提供服务&#xff1f; CS/P2P 提高域名解析的速度&#xff1a;local name server高速缓存&#xff1a;直接地址映射/低级的域名服务器的地址 本机也有告诉缓存&#xff1a;本机开机的时候从本地域名服务器当中下载域名和地址的对应数据库&#xff0c;放到本地的高…

开发Python网络爬虫应用,爬取链家新房楼盘信息保存到mongodb中,并分析相关数据

这里写自定义目录标题 爬取代码分析数据问题 爬取代码 import requests import time from lxml import html from pymongo import MongoClient import randomBASEURL https://cq.fang.lianjia.com/loupan/# 获取某市区域的所有链接 def get_areas(url):print(获取区县列表)# …

云手机引领社交平台运营新潮流

在网络高度发展的今天&#xff0c;社交平台已经成为企业宣传推广的关键渠道之一。传统的社交运营方式已经无法满足效率的要求&#xff0c;云手机因而开始引领社交平台运营的新潮流。本文将深入探讨云手机如何重新定义社交平台运营&#xff0c;为用户和企业带来更为便捷、智能的…

定期修改公司数据协议的重要性

目录 ​编辑 为公司和客户数据提供更好的安全性 利用现代数据分析工具 标准化您的数据收集流程 改善数据的使用 增强您的营销和销售活动 定义数据分类指南 创建更具凝聚力和协作性的团队 遵守法律法规 结论 企业主可以使用许多对其成功至关重要的工具&#…

[BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务

1.问题描述 使用yarn调度任务时&#xff0c;在CapacityScheduler页面上单击叶队列&#xff08;或子队列&#xff09;时&#xff0c;不会显示应用程序任务信息&#xff0c;root队列可以显示任务。此外&#xff0c;FairScheduler页面是正常的。 No matching records found2.原…

计算机视觉与自然语言处理(Open AI)

1.语音识别技术 语音识别是将语音转换为文本的技术&#xff0c; 是自然语言处理的一个分支。通过特征的提取、模式的匹配将语音信号变为文本或命令&#xff0c;以实现机器识别和理解语音。 按照应用场景的不同&#xff0c;可以大致分为三类&#xff1b; • 电信级系统应用&…

VS配置PCO相机SDK环境

VS配置PCO相机SDK环境 概述:最近要用到一款PCO相机,需要协调其他部件实现一些独特的功能。因此需要用到PCO相机的SDK,并正确配置环境。良好的环境是成功的一半。其SDK可以在官网下载,选择对应版本的安装即可。这里用的是pco.cpp.1.2.0 Windows,VS 2022 专业版。 链接: P…

数据结构 day6 栈+队列+二分查找+插入排序

插入排序 #include <stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv[]) {int a[]{41,50,66,38,32,49,18};int nsizeof(a)/sizeof(a[0]);int i,j,t;for(i1;i<n;i){int ta[i];for(ji-1;j>0;j--){if(t<a[j]){a…

【MATLAB】交叉验证求光滑因子的广义神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 交叉验证求光滑因子的广义神经网络时序预测算法的基本原理如下&#xff1a; 首先&#xff0c;我们需要了解什么是交叉验证和光滑因子。交叉验证是一种评估模型性能的常用方法&#xff0c…

基于源码去理解Iterator迭代器的Fail-Fast与Fail-Safe机制

原创/朱季谦 在Java编程当中&#xff0c;Iterator迭代器是一种用于遍历如List、Set、Map等集合的工具。这类集合部分存在线程安全的问题&#xff0c;例如ArrayList&#xff0c;若在多线程环境下&#xff0c;迭代遍历过程中存在其他线程对这类集合进行修改的话&#xff0c;就可…