ResponseStatusException

news2024/11/18 19:34:12

目录

概述:

综合实例:

继承 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()之外,你可能会考虑重写几个其他重要的方法来进一步定制你的异常处理逻辑:
  1. getMessage():
    重写这个方法可以让你改变异常的错误消息
    这个消息通常会被用在日志中,也可能在一些情况下返回给客户端,取决于你的错误处理配置
  2. getStatus():
    如果你想根据异常发生的上下文动态改变 HTTP 状态码,可以重写 getStatus() 方法
  3. getCause():
    如果你的自定义异常包装了另一个异常,你可以通过 getCause() 方法提供原始的异常;这对于调试和错误跟踪是非常有用的
  4. 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状态码

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

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

相关文章

嵌入式培训3-7

1.在主函数定义字符数组&#xff0c;在自定义函数中实现字符串比较 int strcmp(char *s1, char *s2); 参数&#xff1a;两个字符串 返回值&#xff1a;s1-s2差 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控

一、前言 为什么需要判断视频文件是否含有B帧&#xff0c;这个在推流的时候很容易遇到这个问题&#xff0c;一般来说&#xff0c;没有B帧的视频文件&#xff0c;解码后的数据帧pts和dts都是顺序递增的&#xff0c;而有B帧的则未必&#xff0c;可能有些需要先解码后面显示&…

CentOS上安装MySQL 5.7和MySQL 8.0教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

全天候购药系统(微信小程序+web后台管理)

PurchaseApplet 全天候购药系统&#xff08;微信小程序web后台管理&#xff09; 传统线下购药方式存在无法全天候向用户提供购药服务&#xff0c;无法随时提供诊疗服务等问题。为此&#xff0c;运用软件工程开发规范&#xff0c;充分调研建立需求模型&#xff0c;编写开发文档…

智慧城市的前景:数字孪生技术在智慧城市中的应用前景

目录 一、引言 二、数字孪生技术及其在智慧城市中的应用概述 三、数字孪生技术在智慧城市中的应用前景 1、城市规划与仿真模拟 2、智能交通与出行服务 3、智慧环保与可持续发展 4、智慧公共服务与社会治理 5、智慧能源与绿色建筑 四、数字孪生技术在智慧城市中的挑战与…

稀疏数组实现

博文主要是自己学习的笔记&#xff0c;供自己以后复习使用&#xff0c; 参考的主要教程是B站的 尚硅谷数据结构和算法 稀疏数组(sparse array) 实际需求&#xff1a;五子棋程序中的存盘退出和续上盘的功能 问题分析&#xff1a; 如果直接用二维数组&#xff0c;很多值是默认…

hfish蜜罐搭建与使用

本次是对自己在学习蓝队过程中的一次对安全设备 hfish蜜罐的搭建和使用考核记录,距离之前已 经过去很久了,对之前在考核过程中的操作进行回顾和总结. 蜜罐在这里我进行免费分享 hfish-3.1.4-windows-amd64.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云…

Java工作需求后端代码--实现树形结构

加油&#xff0c;新时代打工人&#xff01; 前端页面 带树形结构的表格 最近在新项目上加班加点&#xff0c;下面是个实现树形结构的数据表格。 需求&#xff1a; 在前端页面表格中展示成树形结构的数据。 技术&#xff1a; 后端&#xff1a;Java、Mybatis-Plus、HuTool树形的…

回南天的解决方案

广东的回南天还是那么湿&#xff0c;各种短视频在秀。 墙上流水 楼顶滴水 厕所镜子看不到人 出门滑行 衣服永远是湿的 湿度100%&#xff01; 那么这个让人难受的回南天&#xff0c;除关门关窗&#xff0c;还有没有更好的解决方案&#xff1f;&#xff1f;&#xff08;小…

ChatGPT提示技巧——零,一和少量示例提示

ChatGPT提示技巧——零&#xff0c;一和少量示例提示 ​ 零样本(zero-shot)、少样本(few-shot)和单样本(one-shot)提示是用于在最少或没有示例的情况下从ChatGPT生成文本的技巧。这些技巧用于当某个具体任务有限定数据的时候或者任务是新的并且没有很好的定义的时候。 提示格…

[HackMyVM]靶场 Run

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

libevent源码解析:io事件(一)

文章目录 前言一、用例简单服务端实现参数设置 二、基本数据结构介绍三、源码分析event_base_newevent_newevent_addevent_base_dispatch 三、libevent和epoll中的事件标记epoll中的事件标记libevent中的事件标记libevent和epoll中事件标记的对应关系 总结 前言 libevent中对三…

libevent源码解析:定时器事件(三)

文章目录 前言一、用例小根堆管理定时器事件小根堆和链表管理定时器事件区别 二、基本数据结构介绍结构体成员分析小根堆和链表common_timeout图示 三、源码分析小根堆管理定时器事件event_newevent_addevent_dispatch 链表common_timeout管理定时器事件event_base_init_common…

react 分步表单中使用useEffect来更新表单值的问题

问题背景&#xff1a;我在完成一个分步表单的功能的时候&#xff0c;在进行点击下一步的时候&#xff0c;会通过useEffect 来监听下一步或者上一步的动作&#xff0c;进行表单赋值&#xff0c;我使用 useEffect(() > {setFieldsValue(formValues);}, [stepNum]) 直接赋值的…

动态规划:Leetcode 91.解码方法

题目 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&am…

【Web安全】XSS攻击与绕过

【Web安全】XSS攻击与绕过 【Web安全靶场】xss-labs-master 1-20 文章目录 【Web安全】XSS攻击与绕过1. XSS攻击是啥&#xff1f;2. XSS如何发生&#xff1f;3. XSS分类3.1. 反射型3.2. 存储型3.3. DOM型 4. XSS攻击方式1. script标签2. img标签3. input标签4. details标签5.…

【IC设计】Windows和Ubuntu下安装Verilator

文章目录 Windows下安装verilatorUbuntu下安装verilator安装前的准备安装verilator检查 Windows下安装verilator windows下安装比较麻烦&#xff0c;需要首先安装cygwin&#xff0c;cygwin是一个包管理工具&#xff0c;类似apt&#xff0c;然后通过cygwin安装verilator所需的各…

『大模型笔记』LLM框架(LangChain、LlamaIndex、Haystack、Hugging Face)哪一个是满足您特定需求的最佳选择?

LLM框架(LangChain、LlamaIndex、Haystack、Hugging Face)哪一个是满足您特定需求的最佳选择&#xff1f; 文章目录 1. LangChain1.1. 优势1.2. 劣势1.1. 理想用例 2. LlamaIndex2.1. 优势2.2. 劣势2.3. 理想用例 3. Haystack3.1. 优势3.2. 劣势3.3. 理想用例 4. Hugging Face…

CSAPP-程序的机器级表示

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