SpringBoot 自定义异常返回数据格式
Spring Boot 默认异常处理
当我们用 spring boot 开发接口是,当遇到异常时返回的数据格式是如下形式的
{"timestamp": "2024-07-06T02:48:55.791+00:00","status": 404,"error": "Not Found","path": "/test"
}
{"timestamp": "2024-07-06T02:53:09.108+00:00","status": 500,"error": "Internal Server Error","path": "/test"
}
这样的数据格式可能和我们接口的数据格式不相符,如果我们想让我们的服务返回统一的数据格式,就需要进行自定义异常处理。
Spring Boot 异常处理实现
当我们向 spring boot 应用发送请求,处理出错时(比如:404,或者对应的接口服务处理逻辑异常)都会将请求转发到 “/error”上,“/error” 的默认请求是由BasicErrorController 处理的核心代码如下:
@RequestMappingpublic ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {HttpStatus status = getStatus(request);if (status == HttpStatus.NO_CONTENT) {return new ResponseEntity<>(status);}Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));return new ResponseEntity<>(body, status);}
处理完后的响应数据格式也就是上面我们提到的默认数据格式。
自定义异常返回数据格式
在 ErrorMvcAutoConfiguration 配置类中由如下代码
@Bean@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)public BasicErrorController basicErrorController(ErrorAttributes errorAttributes,ObjectProvider<ErrorViewResolver> errorViewResolvers) {return new BasicErrorController(errorAttributes, this.serverProperties.getError(),errorViewResolvers.orderedStream().collect(Collectors.toList()));}
通过上述代码可知,只要我们自定义一个 ErrorController 类型的 bean ,BasicErrorController 就不会生效了,所以我们自定义一个 CustomerErrorController 并实现 ErrorController 代码如下
@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class CustomerErrorController implements ErrorController {@RequestMappingpublic ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {Map<String, Object> body = new HashMap<>();body.put("code", "1001");body.put("message", "请求不存在");return new ResponseEntity<>(body, HttpStatus.NOT_FOUND);}
}
再次访问不存在的请求,返回如下数据格式
{"code": "1001","message": "请求不存在"
}
自此,自定义异常返回数据格式功能大功告成。
相关文章:
SpringBoot 自定义异常返回数据格式
Spring Boot 默认异常处理 当我们用 spring boot 开发接口是,当遇到异常时返回的数据格式是如下形式的 {"timestamp": "2024-07-06T02:48:55.79100:00","status": 404,"error": "Not Found","path":…...
【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!!
视频演示 【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!! 1,安装docker方法: #!/bin/shdistribution$(…...
【Unity 3D角色移动】
【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤,包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码: 步骤1:设置角色的物理属性 角色通常使用Character Co…...
个人视角,社会影响力:自媒体的魅力所在
随着数字化时代的到来,自媒体正成为信息传播领域的一场革命。个人视角与社会影响力的结合,赋予了自媒体独特的魅力。在传统媒体受限制的同时,自媒体为每个人提供了表达自己观点和思想的自由。个体的真实视角使得自媒体在信息传播中发挥着重要…...
算法训练营day70
题目1:108. 冗余连接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…...
EtherCAT转Profinet网关配置说明第二讲:上位机软件配置
EtherCAT协议转Profinet协议网关模块(XD-ECPNS20),不仅可以实现数据之间的通信,还可以实现不同系统之间的数据共享。EtherCAT协议转Profinet协议网关模块(XD-ECPNS20)具有高速传输的特点,因此通…...
日志自动分析-Web---360星图GoaccessALBAnolog
目录 1、Web-360星图(IIS/Apache/Nginx) 2、Web-GoAccess (任何自定义日志格式字符串) 源码及使用手册 安装goaccess 使用 输出 3-Web-自写脚本(任何自定义日志格式字符串) 4、Web-机器语言analog(任何自定义日…...
【面试八股文】java基础知识
引言 本文是java面试时的一些常见知识点总结归纳和一些拓展,笔者在学习这些内容时,特地整理记录下来,以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类,Integer和int区别是什么? 使用封装类的目的 对象化:…...
ssrf结合redis未授权getshell
目录 漏洞介绍 SSRF Redis未授权 利用原理 环境搭建 利用过程 rockylinux cron计划任务反弹shell 写公钥免密登录 ubuntu 写公钥免密登录 漏洞介绍 SSRF SSRF(server side request forgrey)服务端请求伪造,因后端未过滤用户输入&…...
魔法自如:精通 IPython %automagic 命令的切换艺术
魔法自如:精通 IPython %automagic 命令的切换艺术 在 IPython 的神奇世界里,魔术命令是其强大交互功能的核心。这些以 % 或 %% 开头的命令,能够执行一系列特殊的操作,从而增强用户的编程体验。但是,你是否知道&#…...
基于CentOS Stream 9平台搭建MinIO以及开机自启
1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录: mkdi…...
shell-awk语法整理
shell-awk语法整理 前言基本语法内置变量1. $02. NF3. NR4. FS5. RS6. OFS7. ORS8. FILENAME9. FNR10. ARGV11. ENVIRON12. IGNORECASE13. RSTART 和 RLENGTH示例解释 内置函数循环语句(后面的;可不加)条件语句高级特性示例 特殊模式BEGINEND组合示例BEG…...
关于忠诚:忠于自己的良知、理想、信念
关于忠诚: 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事,会纠结离开还是留下,这里我们要深知忠诚的定义,我们不是忠诚于某个人、某件事、或者某个机构,而是忠诚于自己的良知,忠诚于自己的理想和…...
探索Linux:开源世界的无限可能
Linux是一款开源操作系统,它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生,他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下,Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…...
深度学习之半监督学习:一文梳理目标检测中的半监督学习策略
什么是半监督目标检测? 传统机器学习根据训练数据集中的标注情况,有着不同的场景,主要包括:监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性,在介绍半监督目标检测方法之前,我…...
Hive 高可用分布式部署详细步骤
目录 系统版本说明 hive安装包下载及解压 上传mysql-connector-java的jar包 配置环境变量 进入conf配置文件中,将文件重命名 在hadoop集群上创建文件夹 创建本地目录 修改hive-site.xml文件 同步到其他的节点服务器 修改node02中的配置 hive-site.xml 修改…...
ubuntu下运行程序时提示缺库问题的有效解决方法
目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况,含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装,然后再去运行,此时可…...
GNU/Linux - wic文件的使用
Yocto/OpenEmbedded使用的磁盘镜像格式是 wic。为嵌入式系统提供 bootable images。 The disk image format used in the Yocto Project is wic. .wic 文件显然只是一个带有分区表和分区的磁盘镜像,就像下载 Linux 发行版时获得的所有 .img 文件一样。这就是为什么你…...
前端JS 插件实现下载【js-tool-big-box,下载大文件(fetch请求 + 下载功能版)
上一节,我们添加了下载大文件的纯功能版,意思就是需要开发者,在自己项目里发送请求,请求成功后,获取文件流的blob数据,然后 js-tool-big-box 帮助下载。 但考虑到,有些项目,可能比较…...
JVM专题之垃圾收集器
JVM参数 3.1.1 标准参数 -version -help -server -cp 3.1.2 -X参数 非标准参数,也就是在JDK各个版本中可能会变动 ``` -Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式,JVM自己来决定 3.1.3 -XX参数 > 使用得最多的参数类型 > > 非…...
深入解析epoll:高并发网络编程核心技术
1. 理解高并发场景下的网络通信挑战在现代网络服务中,处理大量并发连接是一个常见需求。想象一个即时通讯服务器需要同时维持上百万用户的TCP连接,但实际活跃用户(正在收发消息的)可能只有几百个。传统做法如select/poll需要每次将…...
OpenClaw调试技巧:Gemma-3-12b-it任务失败的根本原因分析
OpenClaw调试技巧:Gemma-3-12b-it任务失败的根本原因分析 1. 问题背景与现象描述 上周我在本地部署了Gemma-3-12b-it模型,准备用OpenClaw实现自动化周报生成。结果连续三次任务都在"分析本周工作内容"环节卡住,控制台只显示Task …...
四场景下的两阶段鲁棒优化模型构建与实施——列与约束生成算法及其数据处理机制探究
两阶段鲁棒优化模型 多场景 采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列与约束生成(CCG)算法进行求解,场景分布的概率置信区间由 1-范数和∞-范数约束,程序含拉丁超立方抽样kmeans数据处理程…...
蓝桥杯19725最优分组
import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();double p scanner.nextDouble();double minCost Double.MAX_VAL…...
网站主机技术概述
网站主机技术概述 随着互联网技术的飞速发展,网站已经成为企业和个人展示形象、提供服务的必要平台。网站主机的选择对于网站的稳定性和访问速度至关重要。本文将详细阐述网站主机技术,包括其基本概念、类型、选择标准以及未来发展趋势。 一、网站主机基本概念 网站主机,…...
C#并行编程进阶:除了Task和Parallel,你还需要学会用PerformanceCounter做资源熔断
C#并行编程中的资源熔断机制:用PerformanceCounter构建自适应系统 当你在深夜部署一个高负载数据处理服务时,最可怕的不是代码报错——而是系统在默默崩溃。我曾经历过这样的时刻:一个看似完美的并行处理管道,在凌晨三点突然吞噬了…...
2026 年 1月 24 日-KB5078127(OS内部版本26200.7628 和 26100.7628)带外
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
别再乱配了!给COMSOL选工作站,CPU、内存、主板到底怎么搭才不浪费钱?
COMSOL工作站黄金配置法则:精准匹配需求,避开性能陷阱 当你面对琳琅满目的CPU型号、内存规格和主板参数时,是否感到无从下手?COMSOL Multiphysics作为一款强大的多物理场仿真工具,其性能表现与硬件配置息息相关。但盲目…...
Linux内核中的高精度定时器:hrtimer机制详解
Linux内核中的高精度定时器:hrtimer机制详解 作为一名深耕操作系统和嵌入式开发的工程师,我对Linux内核中的高精度定时器(hrtimer)机制有着深入的理解。hrtimer提供了微秒甚至纳秒级的定时精度,是实时应用的关键基础设…...
ECC 深度解析:怎么让 AI 代理变身你的金牌码农
每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 故事要从一场黑客松说起 2026 年初,在 Anthropic 和 Cerebral Valley 联手搞的那场黑客松上,一个名叫 Everything Claude Code(简称 ECC࿰…...
