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

Java注解家族--`@ResponseBody`

@ResponseBody

@ResponseBody是 Spring 框架中的一个注解,在基于 Spring 的 Web 开发中扮演着重要角色,以下是对它的详细总结:

1.定义与基本功能
  • 定义@ResponseBody注解用于将 Controller 方法的返回值,通过适当的 HttpMessageConverter 转换为指定格式后写入 HTTP 响应体中返回给客户端。它可以应用在方法上,也可以用在类上(当用在类上时,表示该类中所有的处理请求方法都带有@ResponseBody的效果)。
  • 核心功能:将 Java 对象转换为 JSON、XML 或其他格式的数据,而不是像传统的 Spring MVC 控制器方法那样返回一个视图名用于视图解析和渲染。这样,它非常适用于开发 RESTful API,使得后端能够以标准的数据格式(如 JSON)向前端提供数据。
2.应用场景
  • RESTful API 开发:在前后端分离的项目中,后端主要提供 API 接口给前端调用。此时,使用@ResponseBody注解可以让后端方法返回的数据(如User对象)直接序列化为 JSON 格式返回给前端,前端通过 AJAX 等方式获取并解析这些数据。例如,一个获取用户列表的 API 接口方法:
package org.example.controller;
import org.example.domain.User;
import org.example.vo.UserVo;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;@RestController
public class UserController {@PostMapping("/login")public Mono<ResponseEntity<UserVo>> login(@RequestBody User user) {return null;}
}
  • 数据下载等特殊响应:除了返回 JSON 数据,@ResponseBody还可以用于返回文件流、字节数组等数据,用于实现文件下载等功能。例如,通过读取文件内容并将其作为响应体返回给客户端:
3.底层实现原理
  • 消息转换器(HttpMessageConverter):Spring MVC 中有一系列的HttpMessageConverter接口实现类,如MappingJackson2HttpMessageConverter(用于将 Java 对象转换为 JSON 格式)、Jaxb2RootElementHttpMessageConverter(用于转换为 XML 格式)等。当带有@ResponseBody注解的方法执行完成后,Spring MVC 会根据请求头中的Accept字段和响应内容类型,选择合适的HttpMessageConverter来将返回值转换为对应的格式,并写入 HTTP 响应体。
  • 类型匹配与转换:例如,对于一个返回User对象的方法,MappingJackson2HttpMessageConverter会将User对象中的属性(如idnameemail等)按照 JSON 的格式规则,转换为类似{"id": 1, "name": "Alice", "email": "alice@example.com"}的字符串,然后设置到 HTTP 响应体中返回给客户端。
4.与其他注解的关系
  • @Controller:在传统的 Spring MVC 开发中,@Controller用于标识一个控制器类,方法默认返回视图名。当需要返回数据给客户端时,就需要在方法上添加@ResponseBody注解。而@RestController@Controller@ResponseBody的组合注解,使用@RestController标记的类中所有方法都默认带有@ResponseBody的效果,无需逐个添加。
  • @RequestBody@RequestBody用于将 HTTP 请求体中的数据(如 JSON 格式)绑定到方法的参数上,即将请求体数据反序列化为 Java 对象;而@ResponseBody是将方法的返回值序列化为合适的数据格式写入响应体,一个是请求数据的读取转换,一个是响应数据的转换输出。
5.注意事项
  • 依赖配置:使用@ResponseBody进行 JSON 数据转换时,通常需要引入 Jackson 等 JSON 处理库的依赖(Spring Boot 项目中一般会自动引入相关依赖),否则可能会出现找不到合适的HttpMessageConverter而导致转换失败。
  • 数据类型支持:确保返回的数据类型是HttpMessageConverter能够处理的,例如基本数据类型、自定义对象、集合等。对于一些特殊类型,可能需要自定义HttpMessageConverter来实现正确的转换。

总的来说,@ResponseBody注解极大地方便了 Spring 应用开发 RESTful API 以及处理各类数据响应的场景,是实现前后端数据交互的重要工具。

8.3 @Autowired

  • 功能:该注解的作用是自动装配 Spring 容器中的 bean(类),以此实现依赖注入。
  • 用法:它能够用在构造函数、setter 方法、字段或者方法参数上。
@RestController
public class UserController {@Autowiredprivate IUserService userService;@PostMapping("/login")public Mono<ResponseEntity<UserVo>> login(@RequestBody User user) {//1. 访问service层,处理业务逻辑Mono<UserVo> userVoMono = userService.login(user.getUsername(),user.getPassword());//2. 有一个返回数据的处理方案Mono<ResponseEntity<UserVo>> map = userVoMono.map(userVo -> ResponseEntity.ok(userVo));//3. 没有返回数据的处理方案map.defaultIfEmpty(ResponseEntity.status(401).build());return null;}
}
  • 使用提示:从 Spring 4.3 版本开始,如果类只有一个构造函数,那么@Autowired注解可以省略。
http://www.xdnf.cn/news/1164871.html

相关文章:

  • 神经网络——线性层
  • 【c++】leetcode5 最长回文子串
  • 蚂蚁数科AI数据产业基地正式投产,携手苏州推进AI产业落地
  • 奥比中光深度相机开发
  • 感知机-梯度下降法
  • 141 个 LangChain4j Maven 组件分类解析、多场景实战攻略
  • 一个月掌握数据结构与算法:高效学习计划
  • hot100回归复习(算法总结1-38)
  • 零拷贝技术(Zero-Copy)
  • 网络协议(四)网络层 路由协议
  • C++基于libmodbus库实现modbus TCP/RTU通信
  • 大模型——上下文工程 (Context Engineering) – 现代 AI 系统的架构基础
  • C# 实现:动态规划解决 0/1 背包问题
  • iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
  • OCR 身份识别:让身份信息录入场景更高效安全
  • 如何使用终端查看任意Ubuntu的版本信息
  • 用 Three.js 实现 PlayCanvas 风格 PBR 材质教程(第二篇):核心参数与光照模型
  • DBSCAN聚类算法
  • OpenAI Codex CLI与 Google Gemini CLI 比较
  • 关于java8里边Collectors.toMap()的空限制
  • 泛型:C#中的类型抽象艺术
  • Android NDK ffmpeg 音视频开发实战
  • 数据结构 之 【排序】(直接插入排序、希尔排序)
  • 【C++】list的模拟实现
  • 音视频学习(四十二):H264帧间压缩技术
  • 周志华《机器学习导论》第13章 半监督学习
  • [深度学习] 大模型学习3上-模型训练与微调
  • 机器学习初学者理论初解
  • MySQL:表的增删查改
  • 基于VSCode的nRF52840开发环境搭建