当前位置: 首页 > article >正文

Spring 的 ResponseEntity 包装器使用详解

简介

Spring 中,ResponseEntityHTTP 响应的包装器。它允许自定义响应的各个方面:

  • HTTP 状态码

  • 响应主体

  • HTTP 请求头

使用 ResponseEntity 允许完全控制 HTTP 响应,并且它通常用于 RESTful Web 服务中从控制器方法返回响应。

基本语法

ResponseEntity<T> response = new ResponseEntity<>(body, headers, status);
  • T:响应主体的类型

  • body:想要作为响应主体发送的对象(如果不想返回主体,则可以为空)

  • headers:想要包含的任何其他 HTTP 请求头

  • status:HTTP 状态代码(如 HttpStatus.OK、HttpStatus.CREATED等)

示例用法

基本用法:返回简单响应
@RestController
@RequestMapping("/api/posts")
public class PostController {@GetMapping("/{id}")public ResponseEntity<Post> getPost(@PathVariable Long id) {Post post = postService.findById(id);if (post != null) {return new ResponseEntity<>(post, HttpStatus.OK);  // 200 OK} else {return new ResponseEntity<>(HttpStatus.NOT_FOUND);  // 404 Not Found}}
}
返回带有请求头的 ResponseEntity
@GetMapping("/custom-header")
public ResponseEntity<String> getWithCustomHeader() {HttpHeaders headers = new HttpHeaders();headers.add("Custom-Header", "CustomValue");return new ResponseEntity<>("Hello with custom header!", headers, HttpStatus.OK);
}
返回具有创建状态的 ResponseEntity

创建新资源时,通常希望返回 201 Created 状态代码

@PostMapping("/create")
public ResponseEntity<Post> createPost(@RequestBody Post post) {Post createdPost = postService.save(post);URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(createdPost.getId()).toUri();return ResponseEntity.created(location).body(createdPost);
}
返回没有内容的 ResponseEntity

当成功处理一个请求但不需要返回任何内容(例如,一个 DELETE 请求)时,可以使用 204 No Content

@DeleteMapping("/{id}")
public ResponseEntity<Void> deletePost(@PathVariable Long id) {boolean isDeleted = postService.delete(id);if (isDeleted) {return new ResponseEntity<>(HttpStatus.NO_CONTENT);  // 204 No Content} else {return new ResponseEntity<>(HttpStatus.NOT_FOUND);   // 404 Not Found}
}
使用带有异常处理的 ResponseEntity

可以在全局异常处理程序或控制器中使用 ResponseEntity 来处理异常

@ExceptionHandler(PostNotFoundException.class)
public ResponseEntity<String> handlePostNotFound(PostNotFoundException ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
使用 Map 返回 ResponseEntity(例如,对于 JSON 响应)
@GetMapping("/user/{id}")
public ResponseEntity<Map<String, Object>> getUser(@PathVariable Long id) {Map<String, Object> response = new HashMap<>();User user = userService.findById(id);if (user != null) {response.put("status", "success");response.put("data", user);return new ResponseEntity<>(response, HttpStatus.OK);} else {response.put("status", "error");response.put("message", "User not found");return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);}
}
具有泛型类型的 ResponseEntity
@GetMapping("/posts/{id}")
public ResponseEntity<Post> getPostById(@PathVariable Long id) {Post post = postService.findById(id);if (post != null) {return ResponseEntity.ok(post);  // 200 OK with Post object as body}return ResponseEntity.status(HttpStatus.NOT_FOUND).build();  // 404 Not Found with no body
}// ResponseEntity.ok(post) 是 new ResponseEntity<>(post, HttpStatus.OK) 的简写
返回验证错误的 ResponseEntity
@PostMapping("/validate")
public ResponseEntity<Map<String, String>> validateUser(@RequestBody User user, BindingResult result) {if (result.hasErrors()) {Map<String, String> errorResponse = new HashMap<>();result.getFieldErrors().forEach(error -> errorResponse.put(error.getField(), error.getDefaultMessage()));return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);  // 400 Bad Request}userService.save(user);return new ResponseEntity<>(HttpStatus.CREATED);  // 201 Created
}
使用统一的响应对象
  • 定义统一响应对象
public class ApiResponse<T> {private String status;private String message;private T data;private ErrorDetails error;// Constructor for success responsepublic ApiResponse(String status, String message, T data) {this.status = status;this.message = message;this.data = data;}// Constructor for error responsepublic ApiResponse(String status, String message, ErrorDetails error) {this.status = status;this.message = message;this.error = error;}// Getters and setters
}class ErrorDetails {private String timestamp;private int status;private String error;private String path;// Getters and setters
}
  • 在控制器方法中使用统一响应
@GetMapping("/posts/{id}")
public ResponseEntity<ApiResponse<Post>> getPostById(@PathVariable Long id) {Post post = postService.findById(id);if (post != null) {ApiResponse<Post> response = new ApiResponse<>("success", "Post retrieved successfully", post);return new ResponseEntity<>(response, HttpStatus.OK);} else {return getErrorResponse(HttpStatus.NOT_FOUND, "Post not found", "/api/posts/" + id);}
}
private ResponseEntity<ApiResponse<Post>> getErrorResponse(HttpStatus status, String message, String path) {ErrorDetails errorDetails = new ErrorDetails();errorDetails.setTimestamp(LocalDateTime.now().toString());errorDetails.setStatus(status.value());errorDetails.setError(status.getReasonPhrase());errorDetails.setPath(path);ApiResponse<Post> response = new ApiResponse<>("error",message,errorDetails);return new ResponseEntity<>(response, status);
}

响应数据结构示例

  • Success
{"status": "success","message": "Post retrieved successfully","data": {"id": 1,"title": "Hello World","content": "This is my first post"}
}
  • Error
{"status": "error","message": "Post not found","error": {"timestamp": "2025-02-07T06:43:41.111+00:00","status": 404,"error": "Not Found","path": "/api/posts/1"}
}
  • 使用 @ControllerAdvice 全局统一处理异常
@ControllerAdvice
public class GlobalExceptionHandler {// Handle all exceptions@ExceptionHandler(Exception.class)public ResponseEntity<ApiResponse<Object>> handleGeneralException(Exception ex) {ErrorDetails errorDetails = new ErrorDetails();errorDetails.setTimestamp(LocalDateTime.now().toString());errorDetails.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());errorDetails.setError("Internal Server Error");errorDetails.setPath("/api/posts");ApiResponse<Object> response = new ApiResponse<>("error", ex.getMessage(), errorDetails);return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);}
}

常用的 HTTP 状态码

  • HttpStatus.OK:200 OK

  • HttpStatus.CREATED:201 Created

  • HttpStatus.NO_CONTENT:204 No Content

  • HttpStatus.BAD_REQUEST:400 Bad Request

  • HttpStatus.UNAUTHORIZED:401 Unauthorized

  • HttpStatus.FORBIDDEN:403 Forbidden

  • HttpStatus.NOT_FOUND:404 Not Found

  • HttpStatus.INTERNAL_SERVER_ERROR:500 Internal Server Error

相关文章:

Spring 的 ResponseEntity 包装器使用详解

简介 在 Spring 中&#xff0c;ResponseEntity 是 HTTP 响应的包装器。它允许自定义响应的各个方面&#xff1a; HTTP 状态码 响应主体 HTTP 请求头 使用 ResponseEntity 允许完全控制 HTTP 响应&#xff0c;并且它通常用于 RESTful Web 服务中从控制器方法返回响应。 基…...

Git 分布式版本控制工具使用教程

1.关于Git 1.1 什么是Git Git是一款免费、开源的分布式版本控制工具&#xff0c;由Linux创始人Linus Torvalds于2005年开发。它被设计用来处理从很小到非常大的项目&#xff0c;速度和效率都非常高。Git允许多个开发者几乎同时处理同一个项目而不会互相干扰&#xff0c;并且在…...

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…...

torch_bmm验算及代码测试

文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘&#xff0c;比如&#xff0c; mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…...

Vue3 特点

不强制要求组件有根节点 // vue2 <template><div><h1>标题</h1><p>内容</p></div> </template>// vue3 <template><h1>标题</h1><p>内容</p> </template> 注意事项 虽然 Vue 3 不再强制…...

mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制

在 MySQL 8 的 C 源码中&#xff0c;表的最大字段数量限制体现在 MAX_FIELDS 宏定义中。这个宏定义了表中可以拥有的最大字段数量。 代码中的体现 在 mysql_prepare_create_table 函数中&#xff0c;有以下代码段检查表的字段数量是否超过最大限制&#xff1a; cpp if (alt…...

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…...

【OneAPI】通过网页预渲染让搜索引擎收录网页

API简介 网页预渲染&#xff0c;适用于动态网页以及单页面的SEO&#xff0c;支持网页缓存。 您无须更改代码即可让搜索引擎收录您的网页。只要将需要预渲染的页面转发的本接口即可。 如果您使用Nginx作为网页服务器&#xff0c;推荐使用以下配置&#xff1a; #您的网站locat…...

从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓

作者&#xff1a;羿莉&#xff08;萧羿&#xff09; 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型&#xff0c;以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1&#xff0c;而且在推理模型的成本优化上实现了突破…...

【学习笔记】企业数字化转型顶层设计与企业架构TOGAF9.2-第0章 导论

数据要素资产化迈入关键发展期 围绕发挥数据要素乘数作用&#xff0c;研究实施“数据要素x”行动:从供需两端发力&#xff0c;在智能制造、商贸流通、交通物流、金融服务、医疗健康等若干重点领域&#xff0c;加强场景需求牵引&#xff0c;打通流通障碍、提升供给质量&#xf…...

Vue3 Ref全家桶深度解析:掌握响应式编程精髓

Vue3 Ref全家桶深度解析&#xff1a;掌握响应式编程精髓 一、Ref核心概念 1.1 响应式数据容器 const count ref(0) // 相当于创建了一个响应式容器&#xff1a; {value: 0,__v_isRef: true,// 其他响应式系统属性 }1.2 全家桶全景图 #mermaid-svg-VkHPjjlo16rOyItj {font-f…...

如何避免大语言模型中涉及丢番图方程的问题

希尔伯特第十问题是一个著名的数学问题,涉及不定方程(又称为丢番图方程)的可解答性。然而在大模型中,我们希望问题都是确定的可解的,或者说要尽可能的想办法避免不确定的不可解问题。由于丢番图方程问题是不可判定问题(即不存在一个有效的算法能够解决该类问题的所有实例…...

SpringCloud - Sentinel服务保护

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://sentinelguard.io/zh-cn/index.h…...

Java 使用腾讯翻译 API 实现含 HTML 标签文本,json值,精准翻译工具

注意&#xff1a;需搭配标题二的腾讯翻译工具使用 一-1、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationFor…...

前端导出pdf,所见即所得

一、推荐方案&#xff1a;html2canvas jsPDF&#xff08;图片式PDF&#xff09; javascript import html2canvas from html2canvas; import jsPDF from jspdf;const exportPDF async (elementId, fileName) > {const element document.getElementById(elementId);// 1.…...

单片机上SPI和IIC的区别

SPI&#xff08;Serial Peripheral Interface&#xff09;和IC&#xff08;Inter-Integrated Circuit&#xff09;是两种常用的嵌入式外设通信协议&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的详细对比&#xff1a; — 1. 基本概念 SPI&#xff0…...

03-DevOps-安装并初始化Gitlab

Gitlab可以理解为是自己搭建的GitHub&#xff0c;也就是自己的代码仓库。 开启macvlan 在192.168.1.10服务器上&#xff0c;构建Macvlan网络&#xff0c;这种网络模式可以为每个容器独立分配ip。 docker network create -d macvlan \--subnet192.168.1.0/24 \--ip-range192.16…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…...

DFS+回溯+剪枝(深度优先搜索)——搜索算法

DFS也就是深度优先搜索&#xff0c;比如二叉树的前&#xff0c;中&#xff0c;后序遍历都属于DFS。其本质是递归&#xff0c;要学好DFS首先需要掌握递归。接下来咱们就一起来学习DFS涉及的算法。 一、递归 1.什么是递归&#xff1f; 递归可以这样理解把它拆分出来&#xff0…...

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面&#xff0c;我们可以通过在项目文件夹上点击鼠标右键&#xff0c;选择“New”菜单下的“Python File”来创建一个 Python 文件&#xff0c;在给文件命名时建议使用英文字母和下划线的组合&#xff0c;创建好的 Python 文件会自动打开&#…...

ArrayList和LinkedList有什么区别?在什么情况下使用ArrayList更高效?

ArrayList和LinkedList在Java中是两种常用的数据结构&#xff0c;分别基于数组和链表实现。它们在性能、内存使用和适用场景上各有特点。 ArrayList与LinkedList的主要区别 数据结构&#xff1a; ArrayList&#xff1a;基于动态数组实现&#xff0c;元素存储在连续的内存空间…...

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …...

elasticsearch实战应用从入门到高效使用java集成es快速上手

Elasticsearch 因其出色的性能、可扩展性和易用性,成为了处理大规模数据和构建搜索引擎的首选工具。本文将通过一个实际案例,详细讲解如何在 Spring Boot 项目中集成 Elasticsearch,进行数据索引、搜索、聚合分析等操作。 一、Elasticsearch 简介 Elasticsearch 是一个基于…...

Spring Boot 整合 JPA 实现数据持久化

目录 前言 一、JPA 核心概念与实体映射 1. 什么是 JPA&#xff1f; 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口&#xff1f; 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...

如何优化网站结构以促进快速收录?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/104.html 优化网站结构以促进快速收录&#xff0c;可以从以下几个方面入手&#xff1a; 一、合理规划页面结构 扁平化结构&#xff1a;采用扁平化的网站结构&#xff0c;减少层级&#xf…...

【零基础学Mysql】常用函数讲解,提升数据操作效率的利器

以耳倾听世间繁华&#xff0c;以语表达心中所想 大家好,我是whisperrrr. 前言&#xff1a; 大家好&#xff0c;我是你们的朋友whisrrr。在日常工作中&#xff0c;MySQL作为一款广泛使用的开源关系型数据库&#xff0c;其强大的功能为我们提供了便捷的数据存储和管理手段。而在…...

防火墙安全综合实验

防火墙安全综合实验 一、拓扑信息 二、需求及配置 实验步骤 需求一&#xff1a;根据下表&#xff0c;完成相关配置 设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List&#xff1a;10 20Trunk 1、创建vlan10和vlan20 2、将接口划分到对应…...

在Linux上创建虚拟网卡

在 Linux 上创建虚拟网卡可以通过多种方式进行&#xff0c;常见的方式是使用 ip 命令来配置虚拟网卡。以下是一个简单的步骤指南&#xff0c;用于创建虚拟网卡&#xff1a; 步骤 1: 查看现有的网络接口 首先&#xff0c;查看当前网络接口的状态&#xff0c;可以使用以下命令&…...

AWS Savings Plans 监控与分析工具使用指南

一、背景介绍 1.1 什么是 Savings Plans? AWS Savings Plans 是一种灵活的定价模式,通过承诺持续使用一定金额的 AWS 服务来获得折扣价格。它可以帮助用户降低 AWS 使用成本,适用于 EC2、Fargate 和 Lambda 等服务。 1.2 为什么需要监控? 优化成本支出跟踪使用情况评估投…...

中国通信企业协会通信网络安全服务能力评定安全设计与集成服务能力评定三级要求准则...

安全设计与集成服务能力三级是通信网络安全服务能力评定安全设计与集成服务能力评定的最高等级&#xff0c;所需的要求也会更加严苛&#xff0c;不仅要满足安全设计与集成服务二级能力要求的所有条款&#xff0c;还要满足以下要求&#xff1a; 规模与资产要求 1)单位正规编制员…...