ResponseStatusException
目录
概述:
综合实例:
继承 ResponseStatusException-自定义异常类
继承 ResponseStatusException-自定义响应头信息
继承 ResponseStatusException-定制更多异常处理逻辑
继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码
概述:
- 从 Spring 5.0 开始引入
- 特别适用于 Spring WebFlux,也可以在 Spring MVC 中使用
- 使用
ResponseStatusException
可以在代码中的任何地方抛出特定的 HTTP 状态码(比如 404 NOT FOUND 或 400 BAD REQUEST)以及一个可选的错误消息 - 这个类继承自
RuntimeException
,因而它是一个不受检异常(unchecked exception),你不需要在方法签名上声明它,也不必强制捕获它 - 其主要的目的是通过编程方式控制异常以及相应的 HTTP 状态码和错误信息的返回
ResponseStatusException
类的主构造函数如下:status
:一个HttpStatus
枚举值,表示要返回的 HTTP 状态码reason
:一个表示错误详情的String
;这个消息可能会返回给客户端,所以在设置时要注意安全性和敏感信息泄露的问题cause
:引发异常的原始Throwable
对象;这不会直接发送给客户端,通常用于日志记录目的- 有几种构造函数版本,不一定全部需要传入(
reason
)或(cause
),您可以根据实际需求使用它们
综合实例:
- 下面是一个简单的例子,展示如何在控制器方法中使用
ResponseStatusException
: - 在这个例子中,当找不到给定 ID 的 item 时,会抛出
ResponseStatusException
,并且返回状态码404 NOT FOUND
以及错误信息 “Item not found” - 由于
ResponseStatusException
是RuntimeException
的子类,Spring 框架会捕捉到这个异常,并将其转换成相应的 HTTP 响应返回给客户端 - 这个机制允许开发者以非常灵活的方式处理各种各样的异常情况
继承 ResponseStatusException-自定义异常类
- 在 Spring Boot 应用程序中,
ResponseStatusException
是一个构建好的异常类,它可以被直接使用来返回特定的 HTTP 状态代码和消息 - 你可以在方法中直接抛出它,Spring 框架将负责将异常转化为对应的 HTTP 响应
- 但是如果你有特定的需求,比如希望在你的应用程序中创建一系列具有固定状态码和自定义处理逻辑的异常,你可以继承
ResponseStatusException
- 下面是一个简单的例子,定义了一个继承自
ResponseStatusException
的自定义异常类: - 在你的 Spring Boot 应用中使用自定义异常:
- 当
CustomBadRequestException
被抛出时,Spring 框架会捕捉到这个异常,并且根据异常内的信息返回一个HttpStatus.BAD_REQUEST
(400 错误码) 的 HTTP 响应给客户端,并带有 “这里是错误信息” 作为响应体中的错误描述 - 通过这种方式,你可以定义不同的自定义异常类型,来处理你应用程序中不同的错误情况,并返回合适的 HTTP 响应
继承 ResponseStatusException-自定义响应头信息
- 在继承自
ResponseStatusException
的自定义异常类中重写getResponseHeaders()
方法可以让你添加或者定制返回给客户端的 HTTP 响应头 - 默认情况下,
ResponseStatusException
没有响应头或者只有基本的响应头 - 通过重写这个方法,你可以根据你的业务逻辑需要,添加一些特殊的响应头信息
- 例如,你可能想添加一个关于错误的链接,一个特殊的错误追踪 ID,或者控制缓存的头信息
- 下面是一个例子,演示了如何在自定义异常中重写
getResponseHeaders()
方法来添加一个自定义的响应头:
- 在控制器中抛出这个自定义的
CustomBadRequestException
将会导致 Spring 框架处理这个异常,并在最终的 HTTP 响应中包含 ‘X-Custom-Error’ 这个头信息 - 使用自定义的响应头可以提供更多的上下文信息给调用者,或者用来传达非标准的、特定于应用的消息
- 这是一个扩展标准异常处理行为并高度定制异常返回信息的强大方式
- 要注意的是,你应该谨慎添加响应头,确保它们不会暴露敏感信息或者与你的 API 设计冲突
继承 ResponseStatusException-定制更多异常处理逻辑
- 在继承
ResponseStatusException
的自定义异常类中,除了getResponseHeaders()
之外,你可能会考虑重写几个其他重要的方法来进一步定制你的异常处理逻辑:
- getMessage():
重写这个方法可以让你改变异常的错误消息
这个消息通常会被用在日志中,也可能在一些情况下返回给客户端,取决于你的错误处理配置 - getStatus():
如果你想根据异常发生的上下文动态改变 HTTP 状态码,可以重写getStatus()
方法 - getCause():
如果你的自定义异常包装了另一个异常,你可以通过getCause()
方法提供原始的异常;这对于调试和错误跟踪是非常有用的 - printStackTrace() 和 getStackTrace():
这些方法可以被用来获取和打印异常的堆栈追踪
- 通常这些方法的默认实现足够用了,但如果需要的话,你可以提供更多的信息或者定制格式
- 在实际业务情况中,我们可以重写异常类的这些方法来增强错误处理的能力,例如记录额外的调试信息、创建更为详细的错误消息等
- 让我们来创建一个更切实的业务场景来展示这一点:
- 假设我们有一个在线电商平台,当用户尝试创建订单时,如果库存不足,我们希望抛出一个自定义的异常
- 在这个自定义异常中,我们可以重写
getMessage()
方法来提供更丰富的信息,并重写printStackTrace()
和getStackTrace()
方法来添加关于库存不足的特定上下文信息
在这个示例中:
getMessage()
被重写以返回一个更为详细的错误信息printStackTrace()
被重写以打印特定的业务相关错误信息getStackTrace()
被重写以添加自定义的堆栈跟踪元素,这可能对调试有帮助,显示出是在检查库存时出现了问题getStatus()
被重写以返回一个特定的HTTP状态;请注意,通常这也可以通过在抛出异常时传递不同的HttpStatus
枚举值给构造函数来实现getMessage()
被修改以增加更多的业务信息,如最后库存同步时间
通过这样重写这些方法,我们可以提供更加具体的错误状态和信息,以便在记录日志、返回给客户端、调试等方面提供有用的上下文
继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码
- 根据库存不足时的不同情况来设置不同的状态码(比如,如果只是暂时性的库存问题使用
503 Service Unavailable
,如果是产品完全下架则使用410 Gone
) - 可以在自定义异常类中添加逻辑如下:
- 在这个示例中,
chooseHttpStatus
方法基于productDiscontinued
布尔变量的值来选择不同的HTTP状态码 - 如果产品已经停产,那么使用
410 Gone
状态码;如果仅仅是暂时的库存问题,则使用503 Service Unavailable
- 如此,异常类的构造函数中传入的参数
productDiscontinued
决定了异常应该携带的HTTP状态码
相关文章:

ResponseStatusException
目录 概述: 综合实例: 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…...

第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例
吴用说只有公孙胜可以破法术,于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经,于是到了二仙山,并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州,公孙胜说听师傅的。罗真人说出家人不管闲事&a…...

CSAPP-程序的机器级表示
文章目录 概念扫盲思想理解经典好图安全事件 概念扫盲 1.汇编代码使用文本格式,相较于汇编的二进制可读性更好 2.程序内存包括:可执行的机器代码、操作系统需要的信息、管理过程调用和返回的运行时栈、用户分配的内存块 3.链接器为函数调用找到匹配的可…...

TCP传输收发
TCP通信: TCP发端: socket connect send recv close TCP收端: socket bind listen accept send recv close 1.connect int connect(int sockfd, const struct sockaddr *addr, socklen_t ad…...

OJ习题之——圆括号编码
圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码: (1)用一个整数序列Pp1 p2 … pn编码,pi代表在S中第i个右圆括号的左圆括号数量。(记为…...

Android耗电分析之Battery Historian工具使用
Battery-Historian是谷歌推出的一款专门分析Bugreport的工具,是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具,是一款对于分析手机状态,历史运行情况很好的可视化分析工具。 …...

vue el-avatar 使用require提示无法找到图片
报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案...
深入理解 C# 中的 Task:异步编程的利器
深入理解 C# 中的 Task:异步编程的利器 前言一、Task 的基本概念什么是 Task?为什么要使用 Task? Task 的使用方法创建 Task等待 Task 完成Task 返回结果 Task 的进阶用法Task 异常处理Task 同步执行Task 并发限制 Task 的实际应用场景并行计…...

YOLOv9电动车头盔佩戴检测,详细讲解模型训练
向AI转型的程序员都关注了这个号👇👇👇 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来,已经在目标检测领域取得了显著的进展,以其快速和准确的特点而广受欢迎。 论文地址…...

OpenStack之Nova
一 、Nova 使用OpenStack Compute来托管和管理云计算系统。 OpenStack Compute是基础架构即服务 (IaaS)系统的主要部分。 主要模块在Python中实现: 1因为认证,与OpenStack 身份认证keystone 交互。 2因为磁盘和服务器镜像…...

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。
漂亮的网页UI能够吸引人的眼球,给人留下深刻的印象。作为前端开发人员,可以通过不断学习和掌握设计技巧和工具,提升自己的UI设计能力,为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议: 学习设计基础知…...

嵌入式学习第二十六天!(网络传输:TCP编程)
TCP通信: 1. TCP发端: socket -> connect -> send -> recv -> close 2. TCP收端: socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数: 1. co…...

【LeetCode】升级打怪之路 Day 14:二叉树的遍历
今日题目: 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …...

[Unity实战]使用NavMeshAgent做玩家移动
其实除了Character Controller, Rigidbody,我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方(毕竟基于烘焙过的导航网格),一般常见于元宇宙应用和mmo。 根据Unity手册,NavMeshAgent 也有和…...

官网:随便搞个?那不如不搞,搞不好就给公司减分了。
官网建设确实需要认真对待,不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响,降低品牌形象和用户体验。以下是一些官网建设的重要原则: 专业性:官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…...

Ansible 基础入门
2)Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具,基于 Paramiko 开发的,并且基于模块化工作,Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,它是基于 Python 语言…...

讨论:5万官网是建站界的劳斯莱斯了吧,到了软件开发领域呢?
如题,所以赛道选择很重要,当然难度系数也不一样。能花5万元做官网的,凤毛麟角,如果是做软件开发,5万元顶多算个起步价,老铁们,是这样吗?...

手写分布式配置中心(三)增加实时刷新功能(短轮询)
要实现配置自动实时刷新,需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center 服务端改造 服务端增加一个版本号version,新增配置的时候为1,每次更新配置就加1。 Overridepublic long insertConfigDO(…...

【RabbitMQ】WorkQueue
📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 Work Queues Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息 当消息处理比较耗时的时候&…...
国内免费好用 Chat GPT推荐
无论您是寻找技术洞见还是灵感激发,此网站是您的绝佳去处。探索着名作家的精彩观点和创意解决方案,它不仅是知识的源泉,更是思维的驱动力。在这里,您将发现无尽的学习资源和启发,助您不断前行这是一款基于OpenAi开发的…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...