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

【Spring Boot - 注解】@ResponseBody 注解:处理 JSON 响应

文章目录

    • 一、`@ResponseBody` 注解概述
      • 1. 注解的功能
      • 2. 主要功能
    • 二、`@ResponseBody` 的工作原理
      • 1. 接口定义
      • 2. 消息转换器
      • 3. 自动配置与默认行为
    • 三、`@ResponseBody` 的应用场景
      • 1. RESTful API 的实现
      • 2. 返回复杂数据结构
      • 3. 错误处理和异常处理
    • 四、`@ResponseBody` 的配置和自定义
      • 1. 自定义消息转换器
      • 2. 配置 JSON 格式
      • 3. 自定义序列化和反序列化
    • 五、实际应用中的 `@ResponseBody`
      • 1. JSON 数据交互
      • 2. 前后端分离
      • 3. API 文档生成
    • 六、总结

在现代 Web 应用程序中,处理 JSON 数据是实现前后端分离的重要组成部分。Spring Boot 框架提供了许多工具来简化这种数据处理,其中 @ResponseBody 注解是最常用的工具之一。本文将详细介绍 @ResponseBody 的作用、使用方法及其在实际开发中的应用,帮助开发者更好地理解和应用这个注解。

一、@ResponseBody 注解概述

1. 注解的功能

@ResponseBody 是 Spring 框架中的一个注解,用于将方法的返回值直接写入 HTTP 响应体中,而不是返回一个视图名称。这个注解通常用于处理 RESTful Web 服务的请求,返回 JSON 或 XML 数据。

2. 主要功能

  • 直接返回数据:将方法的返回值作为 HTTP 响应的内容,而不是解析为视图。
  • 自动转换数据格式:利用消息转换器将 Java 对象转换为 JSON 或 XML 格式。
  • 简化 RESTful API 的实现:在开发 RESTful API 时,@ResponseBody 注解可以让代码更简洁明了。

二、@ResponseBody 的工作原理

1. 接口定义

在控制器方法上使用 @ResponseBody 注解,Spring 将自动将返回值转换为 JSON 或 XML 格式,并将其写入 HTTP 响应体中。

@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/user")@ResponseBodypublic User getUser() {return new User("John", "Doe", 30);}
}

在上述代码中,getUser 方法返回一个 User 对象,Spring 会将这个对象转换为 JSON 格式并返回给客户端。

2. 消息转换器

Spring Boot 默认配置了多种消息转换器,比如 MappingJackson2HttpMessageConverter,用于将 Java 对象转换为 JSON 格式。你可以通过自定义消息转换器来支持不同的格式或进行额外的转换。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MappingJackson2HttpMessageConverter());}
}

3. 自动配置与默认行为

Spring Boot 提供了自动配置,默认情况下,所有的 REST 控制器方法都会将返回的对象转换为 JSON 格式。你可以通过 application.propertiesapplication.yml 文件配置这些行为。

spring.jackson.serialization.indent_output=true

三、@ResponseBody 的应用场景

1. RESTful API 的实现

在实现 RESTful API 时,@ResponseBody 注解可以简化 API 的开发过程。你可以直接返回 Java 对象,Spring 会自动将其转换为 JSON 格式。

@RestController
@RequestMapping("/api")
public class ProductController {@GetMapping("/products/{id}")public ResponseEntity<Product> getProduct(@PathVariable Long id) {Product product = productService.getProductById(id);return ResponseEntity.ok(product);}
}

2. 返回复杂数据结构

@ResponseBody 注解支持返回复杂的数据结构,比如包含嵌套对象的列表。Spring 会递归地将这些对象转换为 JSON 格式。

@GetMapping("/employees")
public List<Employee> getEmployees() {return employeeService.getAllEmployees();
}

3. 错误处理和异常处理

在处理错误和异常时,@ResponseBody 可以将错误信息以 JSON 格式返回给客户端,使错误处理更加一致和易于解析。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseEntity<ErrorResponse> handleException(Exception e) {ErrorResponse errorResponse = new ErrorResponse("Internal Server Error", e.getMessage());return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);}
}

四、@ResponseBody 的配置和自定义

1. 自定义消息转换器

除了 Spring Boot 默认的消息转换器,你还可以自定义消息转换器来满足特定需求。例如,你可以添加一个自定义的 XML 消息转换器。

@Configuration
public class CustomWebConfig implements WebMvcConfigurer {@Beanpublic HttpMessageConverter<Object> createXmlHttpMessageConverter() {MarshallingHttpMessageConverter converter = new MarshallingHttpMessageConverter();// 设置 XML 序列化return converter;}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(createXmlHttpMessageConverter());}
}

2. 配置 JSON 格式

Spring Boot 提供了丰富的 JSON 配置选项,你可以在 application.propertiesapplication.yml 文件中配置 JSON 序列化和反序列化的选项。

spring.jackson.serialization.indent_output=true
spring.jackson.date-format=yyyy-MM-dd'T'HH:mm:ss.SSSZ

3. 自定义序列化和反序列化

你可以使用 Jackson 的 @JsonSerialize@JsonDeserialize 注解来自定义对象的序列化和反序列化行为。

public class User {@JsonProperty("first_name")private String firstName;@JsonProperty("last_name")private String lastName;@JsonSerialize(using = CustomDateSerializer.class)private Date birthDate;// getters and setters
}

五、实际应用中的 @ResponseBody

1. JSON 数据交互

@ResponseBody 注解简化了前后端数据交互的过程,尤其是在开发现代 Web 应用时。通过将 Java 对象直接转换为 JSON 数据,前端可以方便地处理和展示这些数据。

2. 前后端分离

在前后端分离的项目中,@ResponseBody 注解可以将后端数据以 JSON 格式返回给前端,前端再使用 JavaScript 或框架(如 React、Vue)进行处理和展示。

3. API 文档生成

@ResponseBody 注解配合 Swagger 等 API 文档工具,可以生成详尽的 API 文档,帮助开发者理解和使用接口。

@ApiOperation(value = "获取用户信息", notes = "根据用户 ID 获取用户详细信息")
@GetMapping("/user/{id}")
@ResponseBody
public User getUserById(@PathVariable Long id) {return userService.getUserById(id);
}

六、总结

@ResponseBody 注解在 Spring Boot 中扮演着至关重要的角色,它使得控制器方法可以直接将 Java 对象转换为 JSON 或 XML 数据,并返回给客户端。这一特性简化了 RESTful API 的开发过程,使前后端分离变得更加高效和易于实现。通过合理配置和使用 @ResponseBody,开发者可以创建出更为灵活和强大的 Web 应用程序。

推荐:若依


在这里插入图片描述

相关文章:

【Spring Boot - 注解】@ResponseBody 注解:处理 JSON 响应

文章目录 一、ResponseBody 注解概述1. 注解的功能2. 主要功能 二、ResponseBody 的工作原理1. 接口定义2. 消息转换器3. 自动配置与默认行为 三、ResponseBody 的应用场景1. RESTful API 的实现2. 返回复杂数据结构3. 错误处理和异常处理 四、ResponseBody 的配置和自定义1. 自…...

无人机航拍与ArcGIS融合实战:从地表观测到空间数据可视化的全方位指南!无人机图像拼接数据处理与分析、可视化与制图

目录 第一章 无人机航拍基本流程、航线规划与飞行实践 第二章 无人机图像拼接软件的学习与操作实践 第三章 无人机图像拼接典型案例详解 第四章 无人机图像拼接数据在GIS中的处理与分析 第五章 无人机图像拼接数据在GIS中的可视化与制图 第六章 综合案例:无人机航拍植被动…...

日期转时间濯

tfunction(date_str) local code ,time World:getTimeFromDateString(date_str) return time/(60*60*24) end print(t(2024-08-16)-t(2024-08-3))...

【计算机网络】TCP实战

其实有了UDP的基础&#xff0c;TCP不管怎么说学习起来都还是比较舒服的&#xff0c;至少是比直接就学习TCP的感觉好。 这篇文章最多就是介绍一下起手式&#xff0c;如果想带业务的话和UDP那篇是完全一样的&#xff0c;就不进行演示了。 总的来说还是很简单的。 目录 Echo服务端…...

使用Python制作贪吃蛇小游戏

引言 贪吃蛇游戏是一款经典的电子游戏&#xff0c;玩家通过控制一条不断增长的蛇在格子内移动&#xff0c;并吃掉随机出现的食物来获得分数。随着分数的增加&#xff0c;蛇的身体也会越来越长&#xff0c;游戏的难度也随之提升。在本文中&#xff0c;我们将详细介绍如何使用Py…...

线程的退出

方式1 pthread_exit Void pthread_exit (void *retval) 功能&#xff1a; 结束调用的线程 参数&#xff1a; retval //退出状态值 //需要传的是&#xff0c;退出状态值的地址 注意&#xff1a; 1.pthread_exit 本身表示结束线程 如果用在main函数中 表示结束主线程…...

【AI 绘画】Q版人物定制生成

AI 绘画-PulID手办定制 1. 效果展示 本次测试主要结果展示如下: 牛仔风 古风 2. 基本原理 PuLID是一种类似于 ip-adapter 的恢复面部特征的方法。它同时使用 insightface 嵌入和 CLIP 嵌入,类似于 ip-adapter faceid plus 模型所做的。但是,在将图像传递给 CLIP 之前,还…...

Python爬虫——爬取某网站的视频

爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要…...

Android逆向题解攻防世界-easy-apk

Jeb反编译apk 题目比较简单&#xff0c;就是一个改了码表的base64编码。 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(0x7F04001B); // layout:activity_main((Button)this.findViewById(0x7F0B0076)).set…...

Linux系统使用Typecho搭建个人网站并一键发布公网远程管理本地站点

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大…...

机器学习速成第三集——无监督学习之聚类(理论部分)!

目录 聚类的定义和原理 常见的聚类算法 应用场景 总结 无监督学习中聚类算法的最新进展是什么&#xff1f; K-Means聚类算法在处理大规模数据集时的性能优化方法有哪些&#xff1f; 并行计算模型&#xff1a; 多核处理器优化&#xff1a; 分层抽样&#xff1a; 特征缩…...

【机器学习】CNN的基本架构模块

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 CNN的基本架构模块1. 引言2. 卷积层2.1 基本原理2.2 卷积层的特性2.3 卷积层的超…...

第八节AWK报告生成器(2)

3,1,2 printf 语法: printf("format\n", [arguments])格式说明 format是一个用来描述输出格式的字符串&#xff0c;format格式的指示符都以%开头&#xff0c;后跟一个字符&#xff0c;如下: format含义%c显示字符的asicll%d,%i十进制整数%e,%E科学计数法显示数值…...

Linux 进程间通信之管道

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、通信 1、进程为什么要通信&#xff1f; 1.数据的类型 2.父进程和子进程算通信吗&#xff1f; 2、进程如何通信&#xff1f; 3、进程通信的常见方式&#xff1f; 二、管道 1、概念…...

IDEA 无法启动,点击之后没有任何提示或者界面

当你尝试通过双击或以管理员身份启动程序时&#xff0c;均未能成功&#xff0c;且未收到任何提示信息或界面反馈&#xff0c;这确实令人困扰。为了诊断问题并获取有用的错误信息&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 启用并查看错误信息 首先&#xff0c;你需要…...

ctf 堆栈结构

CTF&#xff08;Capture The Flag&#xff09;竞赛中&#xff0c;理解堆栈结构对于解决涉及二进制分析、逆向工程和利用开发的挑战至关重要。堆栈是在程序执行过程中用于临时存储数据和管理函数调用的关键数据结构。以下是堆栈结构的基本概念及其在CTF竞赛中的应用&#xff1a;…...

sqlserver的openquery配置

1.命令Demo ---openquery--开启Ad Hoc Distributed Queries组件&#xff0c;在sql查询编辑器中执行如下语句exec sp_configure show advanced options,1reconfigureexec sp_configure Ad Hoc Distributed Queries,1reconfigure--关闭Ad Hoc Distributed Queries组件&#xff0…...

Spring boot logback日志框架加载初始化源码

##LoggingApplicationListener监听 Overridepublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationStartingEvent) {onApplicationStartingEvent((ApplicationStartingEvent) event);}else if (event instanceof ApplicationEnvironment…...

qt-11基本对话框(消息框)

基本对话框--消息框 msgboxdlg.hmsgboxdlg.cppmain.cpp运行图QustionMsgInFormationMsgWarningMsgCriticalMsgAboutMsgAboutAtMsg自定义 msgboxdlg.h #ifndef MSGBOXDLG_H #define MSGBOXDLG_H#include <QDialog> #include <QLabel> #include <QPushButton>…...

Windows11下wsl闪退的解决

wsl闪退 1. 原因分析 解释&#xff1a;WSL&#xff08;Windows Subsystem for Linux&#xff09;闪退通常指的是在Windows操作系统中运行的Linux环境突然关闭。这可能是由于多种原因造成的&#xff0c;包括系统资源不足、WSL配置问题、兼容性问题或者是Linux内核的问题。&…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...