Spring Boot 中修改 HTTP 响应状态码(即 `response.status`)可以通过以下几种方式实现
以下是不同场景下的具体方法:
方法 1:直接使用 @ResponseStatus
注解
在 Controller 方法或异常类上使用 @ResponseStatus
注解,直接指定返回的状态码。
场景示例:固定返回指定状态码
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {// 成功创建资源时返回 201@PostMapping("/create")@ResponseStatus(HttpStatus.CREATED) // 状态码 201public String createResource() {return "Resource created";}
}
方法 2:动态返回 ResponseEntity
对象
通过 ResponseEntity
对象在代码中动态控制状态码,适用于需要根据业务逻辑返回不同状态码的场景。
场景示例:根据条件返回不同状态码
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@GetMapping("/user/{id}")public ResponseEntity<String> getUser(@PathVariable Long id) {if (id == 1) {return ResponseEntity.ok("User found"); // 默认 200} else {return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found"); // 404}}
}
方法 3:通过全局异常处理统一修改状态码
使用 @ControllerAdvice
和 @ExceptionHandler
拦截异常并统一设置状态码。
场景示例:资源不存在时返回 404
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import javax.persistence.EntityNotFoundException;@ControllerAdvice
public class GlobalExceptionHandler {// 捕获 EntityNotFoundException 并返回 404@ExceptionHandler(EntityNotFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public String handleEntityNotFound() {return "Resource not found";}
}
方法 4:直接操作 HttpServletResponse
在 Controller 方法中注入 HttpServletResponse
对象,直接设置状态码。
场景示例:手动设置状态码
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@GetMapping("/manual")public String manualStatus(HttpServletResponse response) {response.setStatus(HttpStatus.ACCEPTED.value()); // 状态码 202return "Status manually set";}
}
常见场景与状态码对照表
场景 | 推荐状态码 | 说明 |
---|---|---|
成功 | 200 OK | 默认成功状态码 |
创建资源成功 | 201 Created | 配合 @PostMapping 使用 |
请求参数错误 | 400 Bad Request | 客户端请求错误 |
未授权访问 | 401 Unauthorized | 需要身份验证 |
禁止访问 | 403 Forbidden | 无权限访问资源 |
资源不存在 | 404 Not Found | 请求的资源不存在 |
服务器内部错误 | 500 Internal Error | 未捕获的异常导致服务器错误 |
注意事项
-
优先级问题
ResponseEntity
的优先级高于@ResponseStatus
,如果二者同时存在,以ResponseEntity
为准。 -
直接操作
HttpServletResponse
的限制
如果在设置状态码后修改响应体,可能导致IllegalStateException
,建议优先使用 Spring 提供的抽象(如ResponseEntity
)。 -
全局异常处理的覆盖范围
通过@ControllerAdvice
可以统一处理所有 Controller 抛出的异常,适合集中管理错误状态码。
通过上述方法,你可以根据具体场景灵活控制 HTTP 响应的状态码。推荐优先使用 ResponseEntity
或 @ResponseStatus
保持代码简洁。
以下是结合自定义返回工具类与 Spring Boot 状态码控制的详细方案,提供代码示例和分步说明:
1. 定义统一返回结果工具类
public class ApiResponse<T> {private int code; // 业务状态码(非 HTTP 状态码)private String message; // 提示信息private T data; // 返回数据// 快速创建成功响应(静态工厂方法)public static <T> ApiResponse<T> success(T data) {return new ApiResponse<>(200, "Success", data);}// 快速创建失败响应(链式调用支持)public static ApiResponse<Void> failure(int code, String message) {return new ApiResponse<>(code, message, null);}public ApiResponse<T> code(int code) {this.code = code;return this;}public ApiResponse<T> message(String message) {this.message = message;return this;}// 构造方法、Getter 省略...
}
2. 与状态码控制方法结合使用
场景 1:固定状态码 + 统一数据结构(@ResponseStatus)
@PostMapping("/users")
@ResponseStatus(HttpStatus.CREATED) // 强制 HTTP 201
public ApiResponse<User> createUser(@RequestBody User user) {User savedUser = userService.save(user);return ApiResponse.success(savedUser).message("User created successfully");
}
场景 2:动态状态码 + 统一数据结构(ResponseEntity)
@GetMapping("/products/{id}")
public ResponseEntity<ApiResponse<Product>> getProduct(@PathVariable Long id) {return productService.findById(id).map(product -> ResponseEntity.ok(ApiResponse.success(product)) // HTTP 200).orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(404, "Product not found")));
}
3. 全局异常处理统一包装结果
@ControllerAdvice
public class GlobalExceptionHandler {// 处理业务异常(HTTP 400 + 自定义错误码)@ExceptionHandler(BusinessException.class)public ResponseEntity<ApiResponse<Void>> handleBusinessException(BusinessException ex) {return ResponseEntity.badRequest() // HTTP 400.body(ApiResponse.failure(ex.getCode(), ex.getMessage()));}// 处理资源不存在(HTTP 404)@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ApiResponse<Void>> handleResourceNotFound(ResourceNotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(404, ex.getMessage()));}// 兜底异常处理(HTTP 500)@ExceptionHandler(Exception.class)public ResponseEntity<ApiResponse<Void>> handleGlobalException(Exception ex) {return ResponseEntity.internalServerError().body(ApiResponse.failure(500, "Internal server error"));}
}
4. 进阶工具类(支持链式设置 HTTP 状态码)
public class ApiResponseBuilder<T> {private HttpStatus httpStatus = HttpStatus.OK; // 默认 200private ApiResponse<T> apiResponse;private ApiResponseBuilder(ApiResponse<T> apiResponse) {this.apiResponse = apiResponse;}public static <T> ApiResponseBuilder<T> success(T data) {return new ApiResponseBuilder<>(ApiResponse.success(data));}public ApiResponseBuilder<T> httpStatus(HttpStatus status) {this.httpStatus = status;return this;}public ResponseEntity<ApiResponse<T>> build() {return ResponseEntity.status(httpStatus).body(apiResponse);}
}// 使用示例
@PostMapping("/orders")
public ResponseEntity<ApiResponse<Order>> createOrder() {Order newOrder = orderService.create();return ApiResponseBuilder.success(newOrder).httpStatus(HttpStatus.CREATED) // 设置 HTTP 201.build();
}
5. 关键注意事项
-
明确区分两类状态码
HTTP 状态码
:描述网络请求结果(200/404/500)业务状态码
:描述业务逻辑结果(如 1001=库存不足)
-
推荐优先级
- 优先使用
ResponseEntity
控制 HTTP 状态码 - 使用工具类封装业务状态码
- 优先使用
-
保持响应结构一致性
// 成功示例 {"code": 200,"message": "Success","data": { "id": 1, "name": "test" } }// 错误示例(HTTP 404) {"code": 40401,"message": "Product not found","data": null }
通过这种方式,您既可以精准控制 HTTP 协议层的状态码,又能通过工具类统一业务响应格式,同时保持代码的高度可维护性。
相关文章:
Spring Boot 中修改 HTTP 响应状态码(即 `response.status`)可以通过以下几种方式实现
以下是不同场景下的具体方法: 方法 1:直接使用 ResponseStatus 注解 在 Controller 方法或异常类上使用 ResponseStatus 注解,直接指定返回的状态码。 场景示例:固定返回指定状态码 import org.springframework.http.HttpStatu…...

Linux目录介绍+Redis部署(小白篇)
目录 👑Linux基础✨【目录】 👑Redis 安装1.下载压缩包2.解压3.安装编译环境4.安装到本地5.设置开机自启 👑Linux 自启服务 👑Linux基础 虽然在大二的时候学过Linux,但是很多基础知识都忘了,想再次从基础捡…...
软件开发MVC三层架构杂谈
在当今的软件开发领域,MVC(Model-View-Controller)架构已成为构建复杂系统时不可或缺的设计模式。它通过将应用程序划分为模型(Model)、视图(View)和控制器(Controller)三…...

Python 基础语法速查手册:从入门到精通
Python 作为最受欢迎的编程语言之一,以其简洁易读的语法和强大的功能吸引了大量开发者。本文全面汇总 Python 基础语法知识,帮助初学者快速掌握核心概念,并为后续深入学习打下坚实基础。 1. Python 基础语法结构 1.1 代码结构与缩进规则 Py…...
Spring框架--IOC技术
一、Spring框架的介绍 1、Spring框架的概述 Spring 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一个轻量级的Java开发框架,由 Rod Jo…...
前端vue2-完全前端生成pdf->pdf-lib,html2canvas+jspdf,原生打印,三种方式(打印带有echarts图的pdf)
pdf-lib:优点是可以控制输出内容,缺点是麻烦 html2canvas:优点是直接把html页面转成图片之后插入pdf很方便,不用过多的代码,缺点是不好控制图片大小,容易被戒断,可以把想打印的内容藏在页面外面…...

论文阅读笔记——Emerging Properties in Unified Multimodal Pretraining
BAGEL 论文 商业闭源系统与学术/开源模型的差距很大,BAGEL 旨在通过开源统一架构大规模交错数据主要解决: 架构割裂:理解/生成分属两条网络,信息被压缩在少量条件 token 中,长上下文推理受限。数据贫乏:主…...

JAVA批量发送邮件(含excel内容)
EmailSenderHtmlV1 是读取配置文件《批量发送邮件.xlsx》,配置sheet获取 发件人邮箱 邮箱账号 口令,发送excel数据sheet获取收件人邮箱 抄送人邮箱 邮件标题 第N行开始(N>1,N0默认表头) 第M行结束(M>1,M0默认表头) 附件文件夹…...

Linux(Ubuntu)新建文件权限继承问题
当你在一个工作目权限为777的文件下,新建一个文件的时候,就有可能发生,新建的这个文件,权限和其他文件,或者工作目录不一致的问题,我们不可能每次新建一个文件,就要 sudo chmod -R 777 /PATH 所…...

Java中的String的常用方法用法总结
1.1 String (1)声明 (2)字符串常量 存储字符串数据的容器:private final char value[] 字符串常量都存储在字符串常量池(StringTable)中 字符串常量池不允许存放两个相同的字符串常量 ÿ…...

QGIS如何打开 ARCGIS的mxd工程文件
“SLYR”是一款由著名开源组织“北路开源”开发的一套QGIS兼容和转换ARCGIS样式、工程、设置信息的插件!其主要功能为: 最近项目需要,我使用了一些功能,发现其对中文环境及中文信息支持不太好,还有一些其它BUG…...

基于微信小程序的智能问卷调查系统设计与实现(源码+定制+解答)基于微信生态的问卷管理与数据分析系统设计
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

React 如何封装一个可复用的 Ant Design 组件
文章目录 前言一、为什么需要封装组件?二、 仿antd组件的Button按钮三、封装一个可复用的表格组件 (实战)1. 明确需求2. 设计组件 API3. 实现组件代码4. 使用组件 三、封装组件的最佳实践四、进阶优化 总结 前言 作为一名前端开发工程师,在日常项目中&a…...
CloudWeGo-Netpoll:高性能NIO网络库浅析
一、Netpoll 简介 Netpoll 是由字节跳动开发的高性能 NIO(Non-blocking I/O)网络库,专注于 RPC 场景。在 RPC 场景中,通常有较重的处理逻辑,无法串行处理 I/O。而 Go 的标准库 net 设计了 BIO(Blocking I/…...
Mac的显卡架构种类
目录 一、Intel架构时期的Mac显卡(2006 年至 2020 年) 1. Intel 集成显卡(iGPU) 2. 独立显卡(dGPU)—— AMD 和 NVIDIA (1)AMD Radeon(主流独显选择) &a…...
HTTP基本概述
HTTP基本概述 报文格式 HTTP报文分为 请求报文 和 响应报文 一、请求报文 请求行(Request Line)请求头部(Request Headers)(空行)请求体(Request Body) ← 可选,如 P…...

Canvas SVG BpmnJS编辑器中Canvas与SVG职能详解
Canvas详解与常见API 一、Canvas基础 核心特性 • 像素级绘图:Canvas是基于位图的绘图技术,通过JavaScript操作像素实现图形渲染,适合动态、高性能场景(如游戏、数据可视化)。 • 即时模式:每次绘制需手动…...

dify多实例部署,一台机器部署多个dify实例
dify多实例部署 目的 实现在一台机器上,部署多个dify的实例。比如一个部署1.2版本,一个部署1.3版本。废话没有,直接上干货。 前提 你的电脑已经部署了一个dify实例,并成功运行。比如已经部署成功0.15.3版本。 步骤如下&#…...

ML 48.机器学习之临床生存树(rpartSurv)
简介机器学习中生存树(Survival Tree)的原理详解 生存树是结合决策树与生存分析的机器学习模型,主要用于处理带有时间-事件数据(包含删失数据)的预测问题。其核心目标是:通过树状结构对数据进行递归分割&am…...

HarmonyOS 应用开发,如何引入 Golang 编译的第三方 SO 库
本指南基于笔者临时修复的 ohos_golang_go 项目fork,解决HO 应用导入 cgo编译产物时的 crash 问题。 1. 下载 ohos_golang_go git clone https://gitcode.com/deslord/ohos_golang_go.git📌 该仓库为笔者临时修复版本,修复了 CGO 编译模式下…...
Axure元件动作六:设置图片
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 案例视频: Axure元件动作:设置图片 课程主题:设置图片 主要内容:图片悬停、鼠标按下时、选中...

一体化雷达波明渠流量计简介
一、技术定义与核心原理 一体化雷达波明渠流量计是基于微波技术的全自动流量监测设备,采用 24G K 波段平面雷达技术,通过非接触式测量方式实现对明渠、河道、排水管网等场景的水位、流速及流量监测。其核心原理是利用雷达发射高频电磁波,经水…...

Pr -- 耳机没有Pr输出的声音
问题 很久没更新视频号了,想用pr剪辑一下,结果使用Pr打开后发现耳机没有Pr输出的声音 解决方法 在编辑--首选项-音频硬件中设置音频硬件的输出为当前耳机设备...

白皮精读:2024年国家数据基础设施建设指引【附全文阅读】
《国家数据基础设施建设指引》提出建设覆盖数据采集至安全全链条的新型基础设施,目标到 2029 年形成横向联通、纵向贯通的格局,聚焦数据可信流通、算力协同、高速传输、安全保障四大功能,明确技术架构与重点方向,强调政府与市场协同,分阶段推进试点及规模化部署,为数字中…...
【信息系统项目管理师】第21章:项目管理科学基础 - 23个经典题目及详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1~2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第21题】…...
Mocha-Webpack 使用教程
Mocha-Webpack 使用教程 mocha-webpackmocha test runner with integrated webpack precompiler项目地址:https://gitcode.com/gh_mirrors/mo/mocha-webpack 项目介绍 Mocha-Webpack 是一个结合了 Mocha 和 Webpack 的测试工具,它允许开发者在使用 Webpack 打包的…...
AI硬件革命:OpenAI“伴侣设备”——从概念到亿级市场的生态重构
2025年5月23日,OpenAI宣布以65亿美元全股收购苹果前首席设计师Jony Ive创立的AI硬件公司io,并计划于2026年底前推出首款“AI伴侣设备”,目标出货量达1亿台。这一消息迅速成为全球AI领域的热点,标志着AI技术从云端大模型向端侧硬件…...

穿屏技巧:Mac-Windows一套鼠标键盘控制多台设备 (sharemouse6.0-Keygen)| KM-401A
文章目录 引言I sharemouse6.0介绍功能介绍关闭自动更新安装包II 安装系统对应的sharemouse软件Windowsmac版本III 知识扩展:SCP、FTP、SSH文件传输SCP配置SSH密钥免密登录FTP(File Transfer Protocal,文件传输协议)引言 基于USB进行同步键盘和鼠标事件,更流畅。 基于局域…...

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代,地理信息数据的分析与可视化对于众…...
【C/C++】线程状态以及转换
文章目录 线程状态以及转换1 基本状态1.1 新建(New)1.2 就绪(Ready / Runnable)1.3 运行中(Running)1.4 阻塞/等待(Blocked / Waiting / Sleeping)1.5 挂起(Suspended&am…...