当前位置: 首页 > news >正文

Springboot配置全局异常通用返回

Springboot配置全局异常通用返回

前言

前端对接了部分接口后,开始抱怨,“后端接口出参的格式总是千奇百怪,没有一个固定的格式,错误信息提示也不明朗,业务的状态码总是东一个西一个,前端这都不好做统一的管理操作”,对此后端开始研究起对出参的统一封转。

约定统一的格式

通过对所有的出参都有固定的格式输出,可以让前端封装拦截器来对请求不同逻辑走向的处理。

简单的业务状态+详情出参

code 约定为业务结果码 2000成功,5000失败message 约定为错误提示信息,data 约定为返回的出参内容。对此就形成了固定的出参json格式如下:

{"code":2000,"message":"成功","data":{}
}

前端可以根据不同的code返回,做不同逻辑处理

  • code = 2000 , 做成功data数据内容的展示
  • code = 5000 , 做失败的提示语message提示

通过Http状态码判断

针对特殊场景的判定,可以根据Http状态码来判断,因为每个请求都有对应的http请求的状态码返回,例如200,500,401,404等常用的状态码,也能当作前端判断请求的情况的依据。

  • 2xx(成功状态码)
    • 200 (OK):请求成功
    • 201 (Created):请求成功,服务器对应资源已创建
    • 202 (Accepted):服务器接受请求,但还没处理好
    • 204 (No Content): 服务器成功处理请求,但没有内容返回
    • 205 (Reset Content): 服务器成功处理请求,要求客户端重置之前显示内容
    • 206 (Partial Content): 服务器成功处理部分请求,用于断点续传
  • 3xx(重定向状态码)
    • 301 (Moved Permanently): 请求资源已经换成新的url,望客户端请求新的地址Location的url
    • 302 (Found): 请求资源暂时换成新的url
    • 304 (Not Modified) : 服务端判断是否资源没被修改,浏览器使用本地缓存
  • 4xx(客户端错误状态码)
    • 400 (Bad Request) :客户端请求格式有问题
    • 401 (Unauthorized) : 未认证或者认证失败
    • 403 (Forbidden) : 没有对应的权限
    • 404 (Not Found): 服务器找不到对应的客户端请求的资源
    • 405 (Method Not Allowed) : 客户端请求方法不被服务端允许要求的
  • 5xx(服务端错误状态码)
    • 500 (Internal Server Error) : 服务器内部程序代码等引起的错误
    • 502 (Bad Gateway):作为网关,收到服务器无效的响应
    • 503 (Service Unavailable) : 服务器无法提供服务
    • 504 (Gateway Time - out) : 作为网关,收到服务器响应超时过慢

复杂展示的业务场景

对于单一code无法描述的场景,可以再额外增添参数来描述具体的场景情况。

  • errorDetails: 错误对象具体字段描述,在指定code为4000-4999之前的错误是有
    • field : 指定具体错误字段
    • errorMsg: 指定具体错误信息
  • timestamp(可选) : 记录请求时间
  • version(可选) :记录接口版本
  • traceId(可选):记录链路追踪id
{"code":4000,"message":"提交格式错误""data":null,"errorDetails":[{"field":"username","errorMsg":"名称必须在6-20个字符内"}]
}

message字段提供一个整体的错误概述,errorDetails则提供具体的错误细节,两者结合可以让前端更全面地了解错误情况

封装常量的案例

请求状态码的枚举值

@Getter
public enum ResultEnum {SUCCESS("请求成功", 2000),ERROR("服务器内部错误", 5000),PARAM_ERROR("参数错误", 4001),;private String msg;private Integer code;ResultEnum(String msg, Integer code) {this.msg = msg;this.code = code;}
}

统一出参的格式封装

@Data
public class ResultData<T> {/*** 默认生成的序列号*/private static final long serialVersionUID = 1L;private Integer code = 2000;//默认成功private String msg = "";private T data;public ResultData(Integer code, String msg) {this.code = code;this.msg = msg;}public ResultData(Integer code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}public static <T> ResultData<T> error(Integer code, String msg) {return new ResultData<T>(code, msg);}public static <T> ResultData<T> error(String msg) {return new ResultData<T>(ResultEnum.ERROR.getCode(), msg);}public static <T> ResultData<T> success(String msg) {return new ResultData<T>(ResultEnum.SUCCESS.getCode(), msg);}public static <T> ResultData<T> success(String msg, T data) {return new ResultData<T>(ResultEnum.SUCCESS.getCode(), msg, data);}}

全局异常处理

@RestControllerAdvice是 Spring 框架提供的用于全局异常处理的注解 ,通过该注解可以是实现集中在一个类中处理异常的问题,避免重复处理异常代码 , 在具体的方法上使用@ExceptionHandler针对性的处理不同异常导致的问题

使用方式

@RestControllerAdvice 
public class GlobalExceptionHandlerAdvice {@ExceptionHandler(MethodArgumentNotValidException.class)public ResultData<Object> resolveMethodArgumentNotValidException(MethodArgumentNotValidException e) {FieldError fieldError = e.getBindingResult().getFieldError();log.error("【参数校验异常】错误提示:{}", fieldError != null ? fieldError.getDefaultMessage() : "");return ResultData.error(ResultEnum.PARAM_ERROR.getCode(), e.getBindingResult().getFieldError().getDefaultMessage());}
}

例如对于之前使用参数校验时@Valid@Validated进行参数验证失败的情况,抛出的MethodArgumentNotValidException异常,就会统一到上述这个方法上处理,bindingResult中能获取到错误的字段和错误的信息,将其打印出来和结果值返回给前端

常见的需补充的错误异常

还有一些其他异常,可以选择性的对其进行一一的处理封装成ResultData返回给前端,最后兜底使用Exception处理异常保证最后输出还是为统一格式。

  • SQLExceptionDataAccessException : 与数据库交互过程中产生的异常
  • HttpRequestMethodNotSupportedException : 请求方式不支持的异常
  • MethodArgumentNotValidException、 ConstraintViolationException : 使用@Valid@Validated时校验参数时可能会遇到的异常
  • HttpMessageNotReadableExceptionHttpMessageNotWritableException : 请求体的数据读写导致的问题
  • IllegalArgumentException : 参数格式错误的异常
  • CustomeException(自定义异常):自定义实现标识特定异常错误
  • Exception : 最后兜底顶级的异常,保证异常处理最后会走到的地方

ExceptionHandler 处理异常优先级

处理的优先级,必然是有精确匹配到的异常处理方法先走,如果没有精确匹配的异常处理,会根据子类->父类的顺序来处理 。

如有如下三种异常,ExceptionA,ExceptionB,ExceptionC ,分别是ExceptionA 是 ExceptionB的父类,ExceptionB是ExceptionC的父类 ,

@ExceptionHandler(ExceptionA.class)
@ResponseBody
public ResultData<Object> ExceptionASolve(ExceptionA e) {
}@ExceptionHandler(ExceptionB.class)
@ResponseBody
public ResultData<Object> exceptionBSolve(ExceptionB e) {
}
@RequestMapping("/hello")
public String hello() {throw new ExceptionC("sss");
}

此时对应请求抛出ExceptionC,全局处理异常方法exceptionBSolve会去对应处理它

注意: 当然还有另外一种情况,你在方法体里定义对同一个异常处理下有多个方法,会导致最后执行到哪个方法是属于不确定性的,因为会取决于方法的定义顺序,类的加载顺序等因素。

总结

和前端沟通设计好统一的返回模板,便于前端进行交互,一般场景下,可以直接使用简单的通用模板来返回。针对额外复杂的场景可以适当的增加参数做区分判断。还有就是对异常进行统一的集中处理,封装成模板返回给前端。

相关文章:

Springboot配置全局异常通用返回

Springboot配置全局异常通用返回 前言 前端对接了部分接口后&#xff0c;开始抱怨&#xff0c;“后端接口出参的格式总是千奇百怪&#xff0c;没有一个固定的格式&#xff0c;错误信息提示也不明朗&#xff0c;业务的状态码总是东一个西一个&#xff0c;前端这都不好做统一的…...

计算机视觉在自动驾驶汽车中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 引言 计算机视觉在自动…...

wordpress functions文件的作用及详细说明

WordPress的functions.php文件是一个非常重要的主题文件&#xff0c;它允许开发者和用户向网站添加自定义代码片段&#xff0c;从而修改网站功能或添加新内容。以下是functions.php文件的主要作用和一些详细说明&#xff1a; 1. 自定义功能添加&#xff1a; functions.php文件…...

Cellebrite VS IOS18Rebooting

Cellebrite VS IOS18Rebooting我们想分享一些有关 iOS 18 重启“功能”的信息。在过去一周左右的时间里&#xff0c;人们对 iOS 18 中一项新的未记录功能产生了极大关注&#xff0c;该功能会导致设备在一段时间不活动后重新启动。 这意味着&#xff0c;如果设备在一定时间不活…...

[每日一氵] PySpark 的 log GC 部分是什么意思

2024-11-15T11:10:40.2920800: 2850.503: [GC (Allocation Failure) [PSYoungGen: 142705K->3472K(141312K)] 1403514K->1264289K(1543168K), 0.0170225 secs] [Times: user0.05 sys0.00, real0.01 secs] 这一行日志来自Java的垃圾收集器&#xff08;Garbage Collector, …...

Transformer中的算子:其中Q,K,V就是算子

目录 Transformer中的算子 其中Q,K,V就是算子 一、数学中的算子 二、计算机科学中的算子 三、深度学习中的算子 四、称呼的由来 Transformer中的算子 其中Q,K,V就是算子 “算子”这一称呼源于其在数学、计算机科学以及深度学习等多个领域中的广泛应用和特定功能。以下是…...

JWTUtil工具类

写一个Jwt工具类 导入如下pom.xml依赖 <!--fastjson依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.33</version></dependency><!--jwt依赖--><dependenc…...

【eNSP】企业网络架构实验——vlan间的路由通信(三)

VLAN间的路由是指不同VLAN之间的通信&#xff0c;通常VLAN是用来分割网络流量和提高网络安全性的。 一、VLAN 1. 什么是VLAN&#xff1f; VLAN&#xff0c;全称是虚拟局域网&#xff08;Virtual Local Area Network&#xff09;&#xff0c;是一种将物理局域网&#xff08;LA…...

软件测试基础二十九 (接口测试 mock)

Mock&#xff08;模拟&#xff09; 一、定义 Mock是在软件开发测试阶段使用的一种技术&#xff0c;用于模拟对象的行为。它主要用于隔离被测试单元&#xff08;如函数、类或模块&#xff09;与外部依赖&#xff0c;使得测试更加独立、可控&#xff0c;并且可以在不需要真实外…...

Learning RAG and Ragas

说明&#xff1a;这是我的学习笔记&#xff0c;很多内容转自网络&#xff0c;请查阅文章末尾的参考资料。 文章目录 RAGRagas评估框架评估维度评估指标Faithfulness (忠实度)Answer Relevance (答案相关度)Context Precision (上下文精确度)Context Recall (上下文召回率)Cont…...

Java项目实战II基于微信小程序的实习记录(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在当今竞争激烈的就业市场中&#xff0…...

GIT将源码推送新分支

1. 创建并切换到新分支 首先&#xff0c;确保你在本地创建了一个新的分支并切换到该分支&#xff1a; git checkout -b new-branch-namenew-branch-name 是你要创建的新分支名称&#xff0c;替换为你需要的名称即可。 2. 确保所有更改已提交 在推送之前&#xff0c;确保你的…...

Python习题 250:删除空文件夹

(编码题)编写一段 Python 代码,删除指定目录的空文件夹。 参考答案: 使用 pathlib 库可以更简洁地处理文件路径。下面是一个使用 pathlib 库递归删除空文件夹的 Python 代码:from pathlib import Pathdef remove_empty_dirs(directory):# 遍历目录及其子目录for path in…...

基本数据类型:Kotlin、Dart (Flutter)、Java 和 C++ 的比较

文章目录 基本数据类型的比较整数类型浮点类型字符类型布尔类型小结 有符号和无符号整数二进制补码表示精度丢失问题结论 在编程语言中&#xff0c;基本数据类型是构建更复杂数据结构的基础。在本文中&#xff0c;我们将比较 Kotlin、Dart (Flutter)、Java 和 C 中的基本数据类…...

源码解析-Spring Eureka(更新ing)

源码解析-Spring Eureka 文章目录 源码解析-Spring Eureka前言一、从Spring.factory和注解开始二、重要的一步EurekaServerInitializerConfiguration三、初始化了什么&#xff1f;自动保护 四, 重新回到EurekaServerAutoConfiguration 前言 无 一、从Spring.factory和注解开始…...

python调用百度通用翻译API

文章目录 1. 简介2. 使用步骤3. api调用实现4. 编码实现 1. 简介 前段时间在做视频语音识别生成多语种字幕时&#xff0c;使用了百度翻译通用翻译api进行翻译。百度翻译平台经过个人认证之后&#xff0c;每月有200万字符的免费翻译额度。还是比较舒服的。 百度翻译开放平台是百…...

Timeline动画「硬切」的问题

1&#xff09;Timeline动画「硬切」的问题 2&#xff09;移动平台纹理压缩格式选择ASTC&#xff0c;美术出图还需遵守POT吗 3&#xff09;如何去掉DOTS Unity.Entities.Graphics创建的BatchRendererGroup的UI相机回调 4&#xff09;Timeline播放动画会产生位移的问题 这是第409…...

CentOS 9 配置网卡

在 CentOS 9 中配置网卡&#xff0c;通常涉及以下几个步骤&#xff1a; 1. 查看网络接口 首先&#xff0c;确认系统上存在的网络接口。可以使用 ip 命令或 ifconfig 命令查看网络接口的状态。 ip a 或者&#xff1a; ifconfig 这将列出所有可用的网络接口&#xff08;例如…...

redis7.x源码分析:(2) adlist双向链表

链表是一种常用的数据结构&#xff08;如果不了解&#xff0c;请先学习数据结构&#xff09;&#xff0c;由于c语言本身没有实现标准的链表库&#xff0c;所以redis自己实现了一个双向链表。 双向链表在redis内部的使用非常的多&#xff0c;几乎所有模块中都有用到。 下面看下它…...

KUKU FM 音频Linux平台免费下载工具

1.工具名称&#xff1a;kuku-dl 功能&#xff1a; ✅ 下载播客、故事和有声读物&#xff01; ✅ 获取所有元数据和封面艺术品。 ✅ 支持字幕&#xff01; 3.使用说明&#xff1a; 3.1. 直接镜像github源码库 &#x1f449; git clone https://github.com/bunnykek/kuku-…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...