SpringBoot实现统一返回值+全局异常处理
在这里首先感谢的就是程序员老罗,从他的项目里面学到了这些东西。
首先就是去创建一个SpringBoot项目,这里我就不多做赘述了
封装一个统一返回对象
package com.example.demo.vo;public class ResponseVO<T> {private String status;private Integer code;private String info;private T data;public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}public T getData() {return data;}public void setData(T data) {this.data = data;}
}
封装一个异常返回对象
package com.example.demo.exception;
import com.example.demo.entity.enums.ResponseCodeEnum;public class BusinessException extends RuntimeException {private ResponseCodeEnum codeEnum;private Integer code;private String message;public BusinessException(String message, Throwable e) {super(message, e);this.message = message;}public BusinessException(String message) {super(message);this.message = message;}public BusinessException(Throwable e) {super(e);}public BusinessException(ResponseCodeEnum codeEnum) {super(codeEnum.getMsg());this.codeEnum = codeEnum;this.code = codeEnum.getCode();this.message = codeEnum.getMsg();}public BusinessException(Integer code, String message) {super(message);this.code = code;this.message = message;}public ResponseCodeEnum getCodeEnum() {return codeEnum;}public Integer getCode() {return code;}@Overridepublic String getMessage() {return message;}/*** 重写fillInStackTrace 业务异常不需要堆栈信息,提高效率.*/@Overridepublic Throwable fillInStackTrace() {return this;}}
定义一个请求结果的枚举
package com.example.demo.entity.enums;public enum ResponseCodeEnum {CODE_200(200,"请求成功"),CODE_404(404,"请求地址不存在"),CODE_600(600,"请求参数错误"),CODE_601(601,"信息已经存在"),CODE_500(500,"服务器返回错误,请联系管理员");private Integer code;private String msg;ResponseCodeEnum(Integer code, String msg) {this.code = code;this.msg = msg;}public Integer getCode() {return code;}public String getMsg() {return msg;}
}
封装一个统一的返回方法(正确,错误,异常)
package com.example.demo.controller;import com.example.demo.entity.enums.ResponseCodeEnum;
import com.example.demo.exception.BusinessException;
import com.example.demo.vo.ResponseVO;public class ABaseController {protected static final String STATUS_SUCCESS = "success";protected static final String STATUS_ERROR = "error";protected <T> ResponseVO getSuccessResponseVO(T t){ResponseVO<T> responseVO = new ResponseVO<>();responseVO.setStatus(STATUS_SUCCESS);responseVO.setCode(ResponseCodeEnum.CODE_200.getCode());responseVO.setInfo(ResponseCodeEnum.CODE_200.getMsg());responseVO.setData(t);return responseVO;}protected <T> ResponseVO getBusinessErrorResponseVO(BusinessException e,T t){ResponseVO vo = new ResponseVO<>();vo.setStatus(STATUS_ERROR);if(e.getCode() == null){vo.setCode(ResponseCodeEnum.CODE_600.getCode());}else{vo.setCode(e.getCode());}vo.setInfo(e.getMessage());vo.setData(t);return vo;}protected <T> ResponseVO getServerErrorResponseVO(T t){ResponseVO vo = new ResponseVO<>();vo.setStatus(STATUS_ERROR);vo.setCode(ResponseCodeEnum.CODE_500.getCode());vo.setInfo(ResponseCodeEnum.CODE_500.getMsg());vo.setData(t);return vo;}}
定义一个全局的异常处理器
package com.example.demo.controller;import com.example.demo.entity.enums.ResponseCodeEnum;
import com.example.demo.exception.BusinessException;
import com.example.demo.vo.ResponseVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.yaml.snakeyaml.constructor.DuplicateKeyException;import javax.servlet.http.HttpServletRequest;@RestControllerAdvice
public class AGlobalExceptionHandlerController extends ABaseController {private static final Logger logger = LoggerFactory.getLogger(AGlobalExceptionHandlerController.class);@ExceptionHandler(value = Exception.class)public Object handleException(Exception e, HttpServletRequest request){logger.error("请求错误,请求地址{},错误信息:", request.getRequestURL(), e);ResponseVO ajaxResponse = new ResponseVO();//404if (e instanceof NoHandlerFoundException) {ajaxResponse.setCode(ResponseCodeEnum.CODE_404.getCode());ajaxResponse.setInfo(ResponseCodeEnum.CODE_404.getMsg());ajaxResponse.setStatus(STATUS_ERROR);} else if (e instanceof BusinessException) {//业务错误BusinessException biz = (BusinessException) e;ajaxResponse.setCode(biz.getCode() == null ? ResponseCodeEnum.CODE_600.getCode() : biz.getCode());ajaxResponse.setInfo(biz.getMessage());ajaxResponse.setStatus(STATUS_ERROR);} else if (e instanceof BindException || e instanceof MethodArgumentTypeMismatchException) {//参数类型错误ajaxResponse.setCode(ResponseCodeEnum.CODE_600.getCode());ajaxResponse.setInfo(ResponseCodeEnum.CODE_600.getMsg());ajaxResponse.setStatus(STATUS_ERROR);} else if (e instanceof DuplicateKeyException) {//主键冲突ajaxResponse.setCode(ResponseCodeEnum.CODE_601.getCode());ajaxResponse.setInfo(ResponseCodeEnum.CODE_601.getMsg());ajaxResponse.setStatus(STATUS_ERROR);} else {ajaxResponse.setCode(ResponseCodeEnum.CODE_500.getCode());ajaxResponse.setInfo(ResponseCodeEnum.CODE_500.getMsg());ajaxResponse.setStatus(STATUS_ERROR);}return ajaxResponse;}}
最后进行测试
package com.example.demo.controller;import com.example.demo.entity.enums.ResponseCodeEnum;
import com.example.demo.exception.BusinessException;
import com.example.demo.vo.ResponseVO;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import org.yaml.snakeyaml.constructor.DuplicateKeyException;@RestController
public class hello extends ABaseController {@RequestMapping("/hello")public void hello() {throw new BusinessException(ResponseCodeEnum.CODE_404);}
}
测试结果
相关文章:

SpringBoot实现统一返回值+全局异常处理
在这里首先感谢的就是程序员老罗,从他的项目里面学到了这些东西。 首先就是去创建一个SpringBoot项目,这里我就不多做赘述了 封装一个统一返回对象 package com.example.demo.vo;public class ResponseVO<T> {private String status;private In…...

windows连接CentOS数据库或Tomcat报错,IP通的,端口正常监听
错误信息 数据库错误: ERROR 2003 (HY000): Cant connect to MySQL server on x.x.x.x (10060) Tomcat访问错误: 响应时间过长 ERR_CONNECTION_TIMED_OUT 基础排查工作 【以下以3306端口为例,对于8080端口来说操作是一样的,只需…...

超详细的胎教级Stable Diffusion使用教程(一)
这套课程分为五节课,会系统性的介绍sd的全部功能和实操案例,让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion,它究竟有多强大? 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…...
流媒体服务器(20)—— mediasoup 之媒体流score评分计算(一)
目录 前言 正文 《流媒体服务器》专栏总览丨蓄力计划_开源流媒体服务器对比-CSDN博客 前言 mediasoup 有一套评估媒体传输通道优劣的机制,主要是通过 score 评分来判断的。今天就先介绍一下这个机制的大体逻辑,后面的文章再详细介绍具体计算的算法。 正文 mediasoup 的…...

用keras识别狗狗
一、需求场景 从照片从识别出狗狗 from keras.applications.resnet50 import ResNet50 from keras.preprocessing import image from keras.applications.resnet50 import preprocess_input, decode_predictions import numpy as np# 加载预训练的ResNet50模型 model ResNet5…...

Sass语法介绍-变量介绍
02 【Sass语法介绍-变量】 sass有两种语法格式Sass(早期的缩进格式:Indented Sass)和SCSS(Sassy CSS) 目前最常用的是SCSS,任何css文件将后缀改为scss,都可以直接使用Sassy CSS语法编写。 所有有效的 CSS 也同样都是有效的 SCSS。 Sass语…...

可调恒流电子负载的基础认识
可调恒流电子负载是模拟真实负载的电子设备,它可以模拟各种不同类型和功率的负载。这种设备的主要功能是接收电源输入,然后以恒定的电流输出,以便对电源或电池进行测试和校准。 首先,我们需要了解什么是恒流,恒流是指在…...
开源模型应用落地-模型记忆增强-概念篇(一)
一、前言 语言模型的记忆是基于其训练数据。具体而言,对于较长的文本,模型可能会遗忘较早的信息,因为它的记忆是有限的,并且更容易受到最近出现的内容的影响。模型无法跨越其固定的上下文窗口,而是根据当前上下文生成回应。 提升模型记忆能力有多种方法,比如改进模型的结…...

SAPUI5基础知识1 - 概览,库,支持工具,自学教程
1. SAPUI5 概览 1.1 SAPUI5 SAPUI5是一种用于构建企业级Web应用程序的开发框架。它是由SAP开发的,基于HTML5、CSS3和JavaScript技术。 SAPUI5提供了一套丰富的UI控件和工具,使开发人员能够快速构建现代化、可扩展和可定制的应用程序。 它还提供了数据…...
常见的获取dom元素的方法
获取 DOM 元素是前端开发中非常常见的操作。以下是几种常用的方法来获取 DOM 元素,以及它们的适用场景和示例: 1. getElementById 用于获取具有指定 id 属性的元素。 示例 let element document.getElementById(myId); 2. getElementsByClassName …...

走进CHEN MEI HUA的设计哲学:书写东方女性力量与态度的时尚篇章
在时尚的舞台中央,品牌不止是商品,更是故事的讲述者、文化的传承者。CHEN MEI HUA,一个源自中国上海的高端女装品牌,以其独特的设计理念及文化内核,成为了时尚界一颗耀眼的明珠。今天,让我们一起走进CMH的世…...
ESrally单机向量检索性能测试全流程
ESrally单机向量检索性能测试全流程 测试方案的尝试 准备测试 ES 的向量检索性能,Vespa 方案由于下载依赖库存在网络问题无法执行成功,终止;开源工具 ann-benchamrk 是一个用于评估近似最近邻(ANN)搜索库的性能测试工具,这个本是最佳选择,但是也由于需要 pip 安装几十…...

小红书释放被封手机号 无限注册
前几年抖音也可以释放被封手机号 那时候都不重视 导致现在被封手机号想释放 基本不可能的 或者就是最少几百块 有专业的人帮你通过某些信息差释放 本教程是拆解 小红书被封手机号怎么释放,从今年开始,被封的手机号无法注销了 所以很困扰 那么本教程来…...
Docker快速启动清单
以下容器均使用 Docker version 24.0.2 版本测试使用,这里需要注意一下,高版本的Docker不支持镜像V1版本,不知道怎么操作才可以让它支持,所以推荐使用低版本 如果觉得不直观,或者觉得有点乱,可以访问以下网…...

京东手势验证码-YOLO姿态识别+Bézier curve轨迹拟合
这次给老铁们带来的是京东手势验证码的识别。 目标网站:https://plogin.m.jd.com/mreg/index 验证码如下图: 当第一眼看到这个验证码的时候,就头大了,这玩意咋识别??? 静下心来细想后的一个方案…...

亚马逊是如何铺设多个IP账号实现销量大卖的?
一、针对亚马逊平台机制,如何转变思路? 众所周知,一个亚马逊卖家只能够开一个账号,一家店铺,这是亚马逊平台明确规定的。平台如此严格限定,为的就是保护卖家,防止卖家重复铺货销售相同的产品&a…...

linux学习笔记——硬盘原理以及linux中的sector与block
在计算机硬盘中,最小的存储单位叫做扇区sector,0.5kb,多个连续扇区组合在一起形成了块block,最小的块包含8个扇区,4kb 我们可以在linux中印证 创建一个新的文件2.txt,查看文件大小为0k 在文件中添加字符后…...

【OceanBase诊断调优】—— 磁盘性能问题导致卡合并和磁盘写入拒绝排查
适用版本 OceanBase 数据库 V3.x、V4.x 版本。 问题现象 OceanBase 集群合并一直未完成,同时 tsar 和 iostat 显示从凌晨 2:30 开始磁盘使用率一直是 100%。怀疑合并导致 IO 上升,IO 可能存在问题,observer.log 的确有大量报错 disk is hu…...

使用unreal engine5.3.2创建c++第一人称游戏
UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法: 前言 为了使用unreal engine5.3.2创建c第一人称游戏,今天安装了Visual Studio 2022专业版。在ue5中创建c工程,结果编译器报错: 严重性 代码 说明 项目…...
关系型数据库的一种自动测评方式
关系型数据库在如今已经是一门比较常用以及重要的技术,现在的大部分应用程序系统都构建于关系型数据库系统之上,数据库技能也是每个IT从业人员的必备技能之一,因此一些高校、培训学校等机构都把数据库课程作为必修课程之一。这就牵涉到考核的问题了,对于学生是否掌握该门技…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...