Springboot3 ResponseEntity 完全使用案例

2025-12-03 18:50

本文主要是介绍Springboot3 ResponseEntity 完全使用案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比...

Spring Boot 3 ResponseEntity 完全使用教程

在Springboot3 | 统一返回类设计:从问题到实现一文中,我们通过自定义设计实现了标准化响应封装类,该方案有效确保了RESTful接口响应数据结构的统一性。值得关注的是,Spring Boot框架本身也提供了类似的标准化响应机制实现方案。
ResponseEntity 是 Spring Boot 中控制 HTTP 响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比直接返回实体类或字符串,灵活性和规范性提升一个量级。接下来我会用最易懂的方式,结合宠物(Pet)管理的实际场景,带你掌握 ResponseEntity 的所有核心用法。

前置准备

1. 项目基础依赖(Maven)

首先确保你的 Spring Boot 3 项目引入了核心依赖(以 3.2.x 版本为例):

<dependencies>
    <!-- Spring Boot Web 核心 -->
    <dependency>
        <groupId>org.springframework.bootphp</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Lombok 简化实体类代码 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!-- 参数校验(用于后续异常场景) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

2. 核心实体类 Pet

补全 Pet 类(添加 Lombok 注解简化 getter/setter,参数校验注解用于后续案例):

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data // 自动生成getter、setter、toString等方法
public class Pet {
    private Long id;         // 宠物ID(唯一标识)
    @NotBlank(message = "宠物名称不能为空")
    private String name;     // 宠物名称
    @NotBlank(message = "宠物品种不能为空")
    private String breed;    // 宠物品种(如"金毛"、"布偶猫")
    @Min(value = 0, message = "宠物年龄不能为负数")
    private Integer age;     // 宠物年龄(单位:岁)
}

3. 模拟数据层(简化案例,无需数据库)

创建一个简单的 PetService 模拟内存数据操作,避免引入数据库复杂度:

import org.springframework.stereotype.Service;
import Java.util.HashMap;
import java.util.Map;
@Service
public class PetService {
    // 模拟数据库存储宠物数据
    private static final Map<Long, Pet> PET_MAP = new HashMap<>();
    // 初始化测试数据
    static {
        PET_MAP.put(1L, new Pet(1L, "旺财", "金毛", 3));
        PET_MAP.put(2L, new Pet(2L, "咪宝", "布偶猫", 2));
    }
    // 根据ID查询宠物
    public Pet getPetById(Long id) {
        return PET_MAP.get(id);
    }
    // 新增宠物
    public Pet addPet(Pet pet) {
        long newId = PET_MAP.size() + 1;
        pet.setId(newId);
        PET_MAP.put(newId, pet);
        return pet;
    }
    // 删除宠物
    public boolean deletePet(Long id) {
        return PET_MAP.remove(id) != null;
    }
}

核心场景案例(结合ApiPost测试)

接下来的所有案例,都基于 PetController 实现,每个场景对应一个真实的 HTTP 业务场景,同时给出 ApiPost 测试步骤。

场景1:查询单个宠物(成功返回200)

业务需求:根据宠物ID查询详情,存在则返回 200 OK + 宠物数据。
Controller 代码

import org.springframework.beans.factory.annotation.Autowired;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/pets")
public class PetController {
    @Autowired
    private PetService petService;
    // 场景1:查询单个宠物(成功返回200)
    @GetMapping("/{id}")
    public ResponseEntity<Pet> getPet(@PathVariable Longhttp://www.chinasem.cn id) {
        Pet pet = petService.getPetById(id);
        // ResponseEntity.ok() 等价于 ResponseEntity.status(200).body(pet)
        return ResponseEntity.ok(pet);
    }
}

ApiPost 测试步骤

  • 新建请求,请求方式选择 GET,URL 填写 http://localhost:8080/pets/1
  • 点击「发送」,查看响应:
    • 状态码:200 OK;
    • 响应体:
{
    "id": 1,
    "name": "旺财",
    "breed": "金毛",
    "age": 3
}

场景2:新增宠物(成功返回201 + 自定义响应头)

业务需求:新增宠物成功后,返回 201 Created(符合 REST 规范),并在响应头中添加 Location(指向新增宠物的查询地址)。
Controller 新增代码

// 场景2:新增宠物(返回201 + 自定义响应头)
@PostMapping
public ResponseEntity<Pet> addPet(@Valid @RequestBody Pet pet) {
    Pet newpet = petService.addPet(pet);
    // 构建响应:状态码201 + Location响应头 + 新增宠物数据
    return ResponseEntity
            .status(201) // 等价于 ResponseEntity.created(URI.create("/pets/" + newPet.getId()))
            .header("Location", "/pets/" + newPet.getId())
            .body(newPet);
}

ApiPost 测试步骤

  • 新建请求,请求方式选择 POST,URL 填写 http://localhost:8080/pets
  • 切换到「Body」标签,选择「jsON」格式,输入请求体:
{
    "name": "小白",
    "breed": "萨摩耶",
    "age": 1
}
  • 点击「发送」,查看响应:
  • 状态码:201 Created;
  • 响应头:包含 Location: /pets/3
  • 响应体:
{
    "id": 3,
    "name": "小白",
    "breed": "萨摩耶",
    "age": 1
}

场景3:删除宠物(成功返回204 无响应体)

业务需求:删除宠物成功后,返回 204 No Content(无响应体,符合 REST 规范);删除失败则返回 404。
Controller 新增代码

// 场景3:删除宠物(成功204,失败404)
@DeleteMapping("/{id}")
public ResponseEntity<Void> deletePet(@PathVariable Long id) {
    boolean isDeleted = petService.deletePet(id);
    if (isDeleted) {
        // 204 无响应体,使用 ResponseEntity.noContent().build()
        return ResponseEntity.noContent().build();
    } else {
        // 404 未找到
        return ResponseEntity.notFound().build();
    }
}

ApiPost 测试步骤

  1. 新建请求,请求方式选择 DELETE,URL 填写 http://localhost:8080/pets/3
  2. 点击「发送」,查看响应:
    • 状态码:204 No Content;
    • 响应体:为空(符合规范);
  3. 测试删除不存在的宠物(URL 改为 http://localhost:8080/pets/99):
    • 状态码:404 Not Found。

场景4:查询宠物不存在(返回404 + 错误信息)

业务需求:查询不存在的宠物时,返回 404 Not Found + 自定义错误提示(而非空响应)。
改造场景1的查询接口

// 场景4:改造查询接口,不存在则返回404 + 错误信息
@GetMapping("/{id}")
public ResponseEntity<Object> getPet(@PathVariable Long id) {
    Pet pet = petService.getPetById(id);
    if (pet != null) {
        return ResponseEntity.ok(pet);
    } else {
        // 构建自定义错误响应体,状态码404
        Map<String, String> error = new HashMap<>();
        error.put("code", "PET_NOT_FOUND");
        error.put("message", "宠物ID:" + id + " 不存在");
        return ResponseEntity.status(404).body(error);
    }
}

ApiPost 测试步骤

  • GET 请求 URL 填写 http://localhost:8080/pets/99
  • 点击「发送」,查看响应:
    • 状态码:404 Not Found;
    • 响应体:
{
    "code": "PET_NOT_FOUND",
    "message": "宠物ID:99 不存在"
}

场景5:参数校验失败(返回400 + 错误信息)

业务需求:新增/修改宠物时,参数不符合规则(如年龄负数、名称为空),返回 400 Bad Request + 详细错误提示。
新增全局异常处理器(统一处理参数校验异常)

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice // 全局异常处理
public class GlobalExceptionHandler {
    // 处理参数校验异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        // 遍历所有校验失败的字段,收集错误信息
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        // 返回400 + 错误信息
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
    }
}

ApiPost 测试步骤

  • POST 请求新增宠物,请求体传入非法参数:
{
    "name": "",
    "breed": "哈士奇",
    "age": -1
}
  • 点击「发送」,查看响应:
  • 状态码:400 Bad Request;
  • 响应体:
{
    "name": "宠物名称不能为空",
    "age": "宠物年龄不能为负数"
}

前端测试

以下是极简版的 AxIOS 请求案例,仅聚焦「前端处理 ResponseEntity 返回内容」的核心逻辑,所有结果直接输出到浏览器控制台:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Axios 处理 ResponseEntity 示例</title>
    <!-- 引入 Axios -->
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
    <button onclick="sendPetRequest()">发送新增宠物请求</button>
    <script>
        // 核心:发送POST请求并处理ResponseEntity返回内容
        async function sendPetRequest() {
            try {
                // 1. 构造请求参数(与后端Pet实体匹配)
                const petData = {
                    name: "小白",
                    breed: "萨摩耶",
                    age: 1
                };
                // 2. 发送POST请求,调用后端返回ResponseEntity的接口
                const response = await axios.post(
                    'http://localhost:8080/pets', // 后端接口地址
                    petData // 请求体
                );
                // 3. 控制台打印ResponseEntity的核心返回内容(重点!)
                console.log("===== ResponseEntity 返回内容解析 =====");
                console.log("1. HTTP状态码(ResponseEntity.status):", response.status); // 201
                console.log("2. 响应头(ResponseEntity.header设置的内容):", response.headers); // 含Location等
                console.log("3. Location响应头具体值:", response.headers.location); // /pets/3
                console.log("4. 响应体(ResponseEntity.body):", response.data); // 新增的Pet对象
    android            console.log("========================================");
            } catch (error) {
                // 4. 异常场景:解析错误的ResponseEntity内容
                console.log("===== 错误的ResponseEntity返回内容 =====");
                if (error.response) {
                    // 后端返回了错误的ResponseEntity(如400/404)
                    console.log("错误状态码:", error.response.status); // 400/404等
                    console.log("错误响应体:", error.response.data); // 后端返回的错误信息
                } else {
                    console.log("请求异常:", error.message); // 网络/配置错误
                }
            }
        }
    </script>
</body>
</html>

核心说明(聚焦 ResponseEntity 处理)

  1. response.status:对应后端 ResponseEntity.status(201) 设置的 HTTP 状态码;
  2. response.headers:对应后端 ResponseEntity.header("Location", ...) 设置的响应头;
  3. response.data:对应后端 ResponseEntity.body(...) 设置的响应体(Pet 对象/错误信息);
  4. 错误场景下,error.response.status/error.response.data 可获取后端返回的错误 ResponseEntity 内容(如 400 时的参数错误信息)。

测试步骤

  1. 启动后端 Spring Boot 项目;
  2. 用浏览器打开该 HTML 文件,点击按钮;
  3. 按 F12 打开控制台(Console 标签),即可看到 ResponseEntity 各部分内容的解析结果。

控制台输出示例(成功场景)

===== ResponseEntity 返回内容解析 =====
1. HTTP状态码(ResponseEntity.status): 201
2. 响应头(ResponseEntity.header设置的内容): {location: '/pets/3', ...}
3. Location响应头具体值: /pets/3
4. 响应体(ResponseEntity.body): {id: 3, name: '小白', breed: '萨摩耶', age: 1}
========================================

控制台输出示例(错误场景,如参数为空)

===== 错误的ResponseEntity返回内容 =====
错误状态码: 400
错误响应体: {name: '宠物名称不能为空', age: '宠物年龄不能为负数'}

核心总结

ResponseEntity 的核心价值是「完全掌控 HTTP 响应」,记住这几个关键用法:

  1. 快捷方法ok()(200)、created()(201)、noContent()(204)、notFound()(404)—— 日常开发优先用,代码更简洁;
  2. 自定义响应status(状态码) + header(键, 值) + body(响应体) —— 满足特殊业务需求;
  3. 响应体灵活:可以是实体类、Map、字符串,甚至 Void(204 场景);
  4. 结合异常处理:统一返回规范的错误响应,提升接口友好性。

所有案例都能直接复制到项目中运行,用 ApiPost 测试时只需注意端口和请求参数,就能快速验证效果。掌握这些用法后,你的 Spring Boot 接口会更符合 REST 规范,也能应对各种复杂的响应需求。

ResponseEntity 的诞生与演进

ResponseEntity 并非 Spring Boot 专属特性,而是Spring Framework 中用于标准化 HTTP 响应的核心类,其诞生和发展完全围绕 Spring 对 RESTful API 支持的演进展开。

1. 首次诞生:Spring Framework 3.0(2009年)

ResponseEntity 最早出现在 Spring Framework 3.0 版本(正式发布时间:2009年12月17日),是 Spring 为强化 RESTful API 开发能力而新增的核心类。

诞生背景

  • 2000年 Roy Fielding 提出 REST 架构风格后,2000年代后期 RESTful API 逐渐成为主流;
  • Spring 2.x 及更早版本对 HTTP 响应的控制极为繁琐(需手动操作 HttpServletResponse 设置状态码、响应头,或通过 ModelAndView 封装结果),无法优雅适配 REST 规范;
  • Spring 3.0 核心目标之一是「原生支持 RESTful 开发」,因此引入 ResponseEntity,将 HTTP 响应的状态码、响应头、响应体 封装为统一对象,让开发者无需直接操作底层 Servlet API。

2. 关键演进节点(与 Spring Boot 关联)

Spring Boot 是基于 Spring Framework 的封装,其对 ResponseEntity 的支持完全依赖底层 Spring 版本:

框架版本关键变化
Spring Framework 3.0首次引入 ResponseEntity,核心能力:封装状态码、响应头、响应体
Spring Framework 4.1新增大量静态工厂方法(如 ok()notFound()noContent()),简化使用
Spring Framework 5.x适配响应式编程(WebFlux),新增 ResponseEntity<T> 对响应式类型的支持
Spring Framework 6.x适配 Jakarta EE 9+(替代 Java EE),包路径从 javax 迁移到 jakarta,但 ResponseEntity 核心逻辑不变
Spring Boot 3.x基于 Spring Framework 6.x 构建,沿用 ResponseEntity 所有特性,无额外修改

3. 核心定位未变

从 2009 年诞生至今,ResponseEntity 的核心设计目标从未改变:

  • 脱离底层 Servlet API 依赖,以面向对象的方式控制 HTTP 响应;
  • 严格遵循 HTTP 规范,支持所有标准状态码(2xx/4xx/5xx)和自定义响应头;
  • 保持灵活性,响应体可适配任意类型(实体类、Map、字符串等)。

总结

  • 「诞生时间」:20php09年(Spring Framework 3.0);
  • 「归属」:Spring Framework 的 spring-web 模块(非 Spring Boot 独创);
  • 「Spring Boot 角色」:仅做集成和简化(如自动配置、无需手动注册 Bean),未改变 ResponseEntity 的核心实现。

你在 Spring Boot 3 中使用的 ResponseEntity,本质是 Spring Framework 6.x 版本的实现,相比 2009 年的初代版本,只是增加了更便捷的静态方法和对 Jakarta EE 的适配,核心能力和设计初衷完全一致。

到此这篇关于Springboot3 ResponseEntity 完全使用案例的文章就介绍到这了,更多相关Springboot ResponseEntity使用内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Springboot3 ResponseEntity 完全使用案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156342

相关文章

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

C# 预处理指令(# 指令)的具体使用

《C#预处理指令(#指令)的具体使用》本文主要介绍了C#预处理指令(#指令)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1、预处理指令的本质2、条件编译指令2.1 #define 和 #undef2.2 #if, #el

C#中Trace.Assert的使用小结

《C#中Trace.Assert的使用小结》Trace.Assert是.NET中的运行时断言检查工具,用于验证代码中的关键条件,下面就来详细的介绍一下Trace.Assert的使用,具有一定的参考价值... 目录1、 什么是 Trace.Assert?1.1 最简单的比喻1.2 基本语法2、⚡ 工作原理3

C# IPAddress 和 IPEndPoint 类的使用小结

《C#IPAddress和IPEndPoint类的使用小结》本文主要介绍了C#IPAddress和IPEndPoint类的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录一、核心作用网络编程基础类二、IPAddress 类详解三种初始化方式1. byte 数组初始化2. l

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达