What is `@ResponseBody` does?

@ResponseBodySpringMVC框架中的一个注解,将方法返回值转换为HTTP响应体内容

@ResponseBody 注解应用在一个控制器方法上时,SpringMVC会将该方法的返回对象(如Java对象、字符串或基本类型)通过MessageConverter转换为指定的媒体类型(如JSONXML等),然后直接写入HTTP响应体中,而不是经过视图解析器查找和渲染视图。

使用样例

RESTful API开发

RESTful API开发:在创建REST服务时,通常需要将业务对象以JSON或其他格式发送给客户端。这时可以使用 @ResponseBody 来直接返回对象,框架会自动进行序列化

返回基本数据类型

import org.springframework.web.bind.annotation.*;@RestController
public class CalculatorController {@GetMapping("/calculate")@ResponseBodypublic double addNumbers(@RequestParam("num1") double num1, @RequestParam("num2") double num2) {return num1 + num2;}
}

返回JSON格式数据

import org.springframework.web.bind.annotation.*;@RestController
public class ProductController {@GetMapping("/products/{id}")@ResponseBodypublic Product getProduct(@PathVariable Long id) {// 获取产品逻辑...Product product = productService.findById(id);return product; // 返回的对象会被自动序列化为JSON并发送给客户端}@PostMapping("/products")@ResponseBodypublic Product createProduct(@RequestBody Product newProduct) {// 创建产品逻辑...Product createdProduct = productService.create(newProduct);return createdProduct; // 同样将返回的对象序列化为JSON响应体}
}

返回字符串

import org.springframework.web.bind.annotation.*;@RestController
public class MessageController {@GetMapping("/message")@ResponseBodypublic String getMessage() {return "Hello, World!"; // 直接返回一个字符串,它会作为HTTP响应体内容}
}// 或者更复杂的动态生成的字符串
@GetMapping("/dynamic-message")
@ResponseBody
public String getDynamicMessage(@RequestParam String name) {return "Hello, " + name + "!"; // 根据请求参数生成消息,并作为响应体返回
}

返回自定义对象集合

import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/employees")
public class EmployeeController {@GetMapping@ResponseBodypublic List<Employee> getAllEmployees() {// 获取所有员工逻辑...List<Employee> employees = employeeService.getAll();return employees; // 返回的员工列表会被转换为JSON并发送给客户端}
}// 假设Employee类如下:
public class Employee {private Long id;private String name;private String position;// 构造函数、getter和setter省略
}

返回HTTP状态码及响应体

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;@RestController
public class StatusController {@GetMapping("/status/{code}")@ResponseBodypublic ResponseEntity<String> getStatus(@PathVariable int code) {if (HttpStatus.resolve(code) == null) {return ResponseEntity.badRequest().body("Invalid status code");}return ResponseEntity.status(code).body("Requested status code: " + code);}
}

返回分页数据

import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/products")
public class ProductController {private final ProductService productService;public ProductController(ProductService productService) {this.productService = productService;}@GetMapping(params = {"page", "size"})@ResponseBodypublic Page<Product> getProducts(@RequestParam("page") int page, @RequestParam("size") int size) {return productService.getProducts(page, size);}
}

返回异步处理并返回结果

import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.CompletableFuture;@RestController
public class AsyncController {@Async@GetMapping("/async-result")@ResponseBodypublic CompletableFuture<String> getAsyncResult() {// 模拟耗时操作try {Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}return CompletableFuture.completedFuture("This is the result from an asynchronous operation");}
}

返回异步返回文件下载链接

import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class FileDownloadController {@Async@GetMapping("/generate-file")@ResponseBodypublic Future<ResponseEntity<String>> generateFileAndReturnLink(@RequestParam("filename") String filename) {// 模拟文件生成过程try {Thread.sleep(5000); // 模拟耗时操作} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 假设fileService.generateFile(filename)返回的是文件存储路径String fileUrl = fileService.generateFile(filename);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.TEXT_PLAIN);return CompletableFuture.completedFuture(ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"").header(HttpHeaders.LOCATION, fileUrl).body("The file has been generated. Download it from: " + fileUrl));}
}

与@RestController配合使用

如果一个控制器类的所有方法都需要返回响应体内容,而不是视图名,那么可以将整个类标记为 @RestController

@RestController = @Controller + @ResponseBody

@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {// 不需要单独标注@ResponseBody,因为@RestController已经提供了这个功能return userService.findById(id);}
}

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

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

相关文章

跳转漏洞靶场记录(重定向漏洞)

目录 简单介绍 绕过方式及更多介绍 靶场搭建 vulhub 漏洞原因 DVWA

宋仕强论道之华强北电子交易中心(四十三)

最近中国电子CECC牵头的电子交易中心在前海挂牌&#xff0c;这给华强北带来了一些威胁&#xff0c;也蚕食了部分华强北市场。事实上&#xff0c;电子元器件市场是一个非常巨大且复杂的市场&#xff0c;包括了各种各样的产品和配套的服务。比如说存储产品这一块&#xff0c;标准…

在Overleaf中解决IEEE LaTeX模板不能显示中文问题

解决IEEE的Latex模板不能显示中文的问题 写在最前面编译器选择XeLatex导入CTeX包IEEE单栏转换为双栏如何在Overleaf中解决IEEE LaTeX模板显示中文问题&#xff1a;一些其他的补充引言问题描述准备工作为什么中文字符在IEEE LaTeX模板中显示有问题——了解LaTeX编码的基础概念 关…

写点东西《最佳 Web 框架不存在 》

写点东西《&#x1f947;最佳 Web 框架不存在 &#x1f6ab;》 TLDR&#xff1b;您选择的 Web 应用程序框架并不重要。嗯&#xff0c;它很重要&#xff0c;但并不像其他人希望您相信的那样重要。 2024 年存在如此多的库和框架&#xff0c;而且最好的库和框架仍然备受争议&…

C语言——小细节和小知识10

一、全局变量和局部变量 1、引例 当全局变量和局部变量名字相同的情况下&#xff0c;局部变量优先。 #include <stdio.h>int num 10;int main() {int num 0;printf("%d\n", num);return 0; } 运行结果 2、介绍 在C语言中&#xff0c;当局部变量和全局变…

高光谱分类论文解读分享之基于生成对抗性少数过采样的高光谱图像分类

IEEE TGRS 2022&#xff1a;基于生成对抗性少数过采样的高光谱图像分类 题目 Generative Adversarial Minority Oversampling for Spectral–Spatial Hyperspectral Image Classification 作者 Swalpa Kumar Roy , Student Member, IEEE, Juan M. Haut , Senior Member, IE…

【野火i.MX6NULL开发板】ARM-GCC 和开发板的 HelloWorld(ubuntu主机和野火开发板debian交叉编译)、开发板的/mnt里没文件

0、前言 参考资料&#xff1a; 《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第24章 参考视频&#xff1a; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab700c21099045395 注意&#xff0c;一定要记得把虚拟机的网络适配…

J3-DenseNet实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境步骤环境设置数据准备图像信息查看 模型构建模型训练模型效果展示 总结与心得体会 环境 系统: Linux语言: Python3.8.10深度学习…

接口自动化神器 apin【 快速入门篇】

关于自动化测试&#xff0c;这些年经历了太多的坑&#xff0c;有被动的坑&#xff0c;也有自己主动挖的坑&#xff0c;在这里做了一些总结。 一、apin 介绍及安装 1、什么是 apin apin是一个无需写代码&#xff0c;就可以进行接口自动化测试的框架&#xff0c;只需要通过jso…

【线路图】世微AP5160宽电压降压型恒流芯片 LED电源 带调光SOT23-6

这是一款14-18V 3A 电流的PCB设计方案. 运用的是世微AP5160 电源驱动IC,这是一款效率高&#xff0c;稳定可靠的 LED 灯恒流驱动控制芯片&#xff0c;内置高精度比较器&#xff0c;固定 关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c;特别适合大功率 LED 恒流驱动。 …

59.说一下 spring 的事务隔离?

spring 的事务隔离有什么作用? 用来解决并发事务所产生一些问题,并发会产生什么问题? 1.脏读2.不可重复度3.幻影读事务隔离的概念 通过设置隔离级别可解决在并发过程中产生的那些问题分别举例说明 1.脏读 上述图表示:一个事务,读取了另一个事务中没有提交的数据,会在…

组播的原理和使用

目录 测试代码(python)Linux工具 测试代码(python) code1: python实现一个使用socket模块创建一个组播套接字并将当前主机加入到该组播中。这个例子使用了组播地址"224.1.1.1"和端口5007&#xff0c;这个脚本可以用于验证功能或协助测试&#xff0c;定位问题。 imp…

【AD-3D预览-颜色更换和模型操作】AD打开3D预览模式,PCB板子显示蓝色,如何更改为绿色

问题&#xff1a;AD软件的3D预览模式中&#xff0c;PCB的颜色和其他不一样&#xff0c;显示的是蓝色&#xff0c;而且正面可以看到走线&#xff0c;背面看不到 原因&#xff1a; 这是因为选择的查看模式不一样所导致的。 在这个位置可以查看当前所使用的模式是什么&#xff0…

IPKISS ------ 远程服务器 IPKISS 内置示例安装问题

IPKISS ------ 远程服务器示例安装问题 引言正文 引言 很多时候&#xff0c;如果我们在服务器上使用管理员权限安装了 IPKISS 证书&#xff0c;而我们使用个人账号登录服务器时有时候会显示如下界面&#xff1a; 我们会看到这个 PyCharm (Luceda Academy) 是灰色的。那么该怎…

高阶函数和函数的柯里化

一、高阶函数 定义&#xff1a; 如果一个函数符合下面2个规范中的任何一个&#xff0c;那该函数就是高阶函数&#xff1a; 1、若 A 函数&#xff0c;接受的参数是一个函数&#xff0c;那么 A 就可以称为高阶函数。2、若 A 函数&#xff0c;调用的返回值依然是一个函数&#x…

嵌入式行业算青春饭吗?

今日话题&#xff0c;嵌入式行业算青春饭吗&#xff1f;嵌入式行业的技术要求确实非常广泛&#xff0c;需要深厚的知识广度和深度。这意味着入行门槛较高&#xff0c;我们需要了解不仅是软件和硬件&#xff0c;还要熟悉底层接口和硬件信号的处理方式&#xff0c;了解数据在计算…

网络文件共享服务、FTP和yum仓库

目录 一、存储类型 1、存储类型一共分为三种&#xff1a; 2、三种存储架构的应用场景 二、FTP文本传输协议 1、FTP工作原理介绍 2、FTP数据连接模式 3、svftpd的安装和配置 4、vsftpd的配置作用 5、黑名单和白名单的使用&#xff08;简要介绍&#xff09; 三、YUM 1…

芯品荟 | 温控器、线控器市场调研报告

PART ONE 产品简介 一、什么是温控器、线控器 温控器\线控器属于工业测量及智能家居产品&#xff0c;目前主流的包括LCD段码屏、TFT液晶屏。 PART TWO 市场规模 智能家居线控器市场规模 智能家居已成为最具潜力的消费科技市场&#xff0c;2022年市场规模约为6515.6亿元。 …

【leetcode 2719.统计整数数目】特殊动态规划之数位DP(数位动态规划)

2719. 统计整数数目 题目描述 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2min_sum < digit_sum(x) < max_sum. 请你返回好整数的…

微信小程序定义并获取日志/实时log信息

步骤一&#xff1a;开通实时日志 可以在开发者工具->详情->性能质量->实时日志&#xff0c;点击前往&#xff0c;在浏览器打开we分析界面&#xff1a; 也可登录小程序管理后台&#xff0c;点击统计进入we分析&#xff1a; 在we分析界面找到性能质量&#xff0c;打开实…