Spring MVC @RequestBody 注解怎么用?接收什么格式的数据?

@RequestBody 注解的作用

@RequestBody 将方法上的参数绑定到 HTTP 请求的 Body(请求体)的内容上

当客户端发送一个包含数据的请求体(通常在 POST, PUT, PATCH 请求中)时,@RequestBody 告诉 Spring MVC 读取这个请求体,并使用已注册的 HttpMessageConverter 将其内容**反序列化(Deserialize)**为一个 Java 对象。

简单来说,它允许我们直接将请求中发送的 JSON、XML 或其他格式的数据映射到一个 Java 对象(通常是一个 POJO - Plain Old Java Object)。

@RequestBody 的工作机制

  1. 读取请求体: Spring MVC 获取 HTTP 请求的输入流。
  2. 检查 Content-Type Header: 查看请求头中的 Content-Type,例如 application/jsonapplication/xml。这个 Header 会告诉服务器客户端发送的是什么格式的数据。
  3. 选择 HttpMessageConverter: Spring MVC 会查找已注册的、能够处理该 Content-Type 的请求体内容转换为方法参数指定类型的 HttpMessageConverter
  4. 反序列化: HttpMessageConverter 读取请求体内容,并将其转换为目标 Java 对象。
  5. 参数绑定: 转换后的 Java 对象会传递给带有 @RequestBody 注解的方法参数。

常用场景:接收 JSON 或 XML 数据

@RequestBody 最常用于接收客户端发送的 JSON 或 XML 数据,尤其是在构建 RESTful API 时。

示例:接收 JSON 数据

假设客户端发送一个 POST 请求到 /api/users,请求体包含以下 JSON 数据:

{"username": "john.doe","email": "john.doe@example.com","age": 30
}

并且请求头中设置了 Content-Type: application/json

我们可以定义一个对应的 Java POJO:

// User.java (POJO)
public class User {private String username;private String email;private int age;// Getters and Setters (必需,供 Jackson 等库使用)public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", email='" + email + '\'' +", age=" + age +'}';}
}

然后在 Controller 中这样使用 @RequestBody

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;@RestController
@RequestMapping("/api/users")
public class UserController {@PostMappingpublic ResponseEntity<String> createUser(@RequestBody User user) {// 此时,Spring MVC 已经使用 HttpMessageConverter (通常是 Jackson)// 将请求体中的 JSON 数据转换为了一个 User 对象实例 'user'System.out.println("Received user: " + user);// 在这里可以进行保存用户等业务逻辑...// userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully: " + user.getUsername());}
}

所需依赖

Spring MVC 依赖 HttpMessageConverter 来实现 @RequestBody 的功能。

  1. 处理 JSON (最常用):

    • 依赖库: Jackson Databind (jackson-databind) 是 Spring Boot 和 Spring MVC 处理 JSON 的默认库。
    • 如何添加: 如果使用 Spring Boot,spring-boot-starter-web starter 会自动包含 jackson-databind。通常不需要手动添加它。
    • Maven 示例 (如果未使用 Spring Boot Starter 或需要特定版本):
      <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><!-- <version>...</version> --> <!-- Spring Boot 管理版本 -->
      </dependency>
      
    • 替代库: 虽然不常用,但也可以配置使用其他 JSON 库,如 Gson (com.google.code.gson:gson) 或 JSON-B。
  2. 处理 XML:

    • 依赖库:
      • JAXB (Java Architecture for XML Binding): 这是 Java 标准库的一部分(直到 Java 10,Java 11 及以后需要单独添加依赖)。Spring 对 JAXB 有内建支持。
      • Jackson XML extension (jackson-dataformat-xml): 这是 Jackson 提供的用于处理 XML 的模块,与处理 JSON 的方式非常相似,通常更受欢迎,因为它与 Jackson 的其他功能(如注解)集成得更好。
    • 如何添加 (Jackson XML): 如果你想使用 Jackson 处理 XML,需要手动添加 jackson-dataformat-xml 依赖。spring-boot-starter-web 包含它。
    • Maven 示例 (Jackson XML):
      <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><!-- <version>...</version> --> <!-- Spring Boot 管理版本 -->
      </dependency>
      
    • POJO 注解: 如果使用 JAXB 或 Jackson XML,需要在 POJO 上添加特定的注解(如 @XmlRootElement, @XmlElement for JAXB,或者 Jackson 也可以使用 JAXB 注解或其自己的注解)映射 XML 结构。不过,对于简单的结构,Jackson XML 也能在没有额外注解的情况下工作。

示例:Controller 处理 XML (假设已添加 jackson-dataformat-xml)

如果客户端发送 Content-Type: application/xml 和以下 XML 请求体:

<User><username>jane.doe</username><email>jane.doe@example.com</email><age>28</age>
</User>

上面的 createUser 方法无需修改(只要 User POJO 的结构匹配),Spring MVC 会自动选择 MappingJackson2XmlHttpMessageConverter(如果 jackson-dataformat-xml 在 classpath 中)来处理请求。

关键点和注意事项

  1. Content-Type Header: 客户端必须发送正确的 Content-Type 请求头,以便 Spring MVC 知道如何解析请求体并选择合适的 HttpMessageConverter。如果 Content-Type 不匹配或缺失,通常会导致 HTTP 415 (Unsupported Media Type) 错误。
  2. 必需性: @RequestBody 标注的参数默认是必需的。如果请求体为空或无法转换为目标类型,会抛出 HttpMessageNotReadableException,通常导致 HTTP 400 (Bad Request) 错误。
  3. 唯一性: 一个 Controller 方法只能有一个参数使用 @RequestBody 注解,因为一个 HTTP 请求只有一个请求体。
  4. 不要与 @RequestParam 混淆: @RequestParam 用于获取 URL 查询参数或表单数据(application/x-www-form-urlencoded),而 @RequestBody 用于获取整个请求体的内容(通常是 JSON 或 XML)。
  5. Validation: 通常会结合 Java Bean Validation API (JSR 380/303) 使用 @RequestBody。通过在 @RequestBody 参数前添加 @Valid 注解,可以自动触请求体反序列化后的对象的校验。
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;// User.java (带校验注解)
public class User {@NotBlank(message = "Username cannot be blank")private String username;@NotBlank@Email(message = "Invalid email format")private String email;@Min(value = 0, message = "Age must be positive")private int age;// ... Getters and Setters ...
}// Controller 方法
@PostMapping
public ResponseEntity<String> createUser(@Valid @RequestBody User user) {// 如果校验失败,Spring 会自动返回 400 Bad Request// 如果校验成功,代码继续执行System.out.println("Received valid user: " + user);// ...return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully: " + user.getUsername());
}

要使 @Valid 生效,需要添加 spring-boot-starter-validation 依赖(如果使用 Spring Boot)或相应的 hibernate-validator 依赖。

总结

  • @RequestBody 用于将 HTTP 请求的完整 Body 反序列化为一个 Java 对象。
  • 主要用于接收 POST, PUT, PATCH 请求中的 JSONXML 数据。
  • 依赖于 HttpMessageConverter 和相应的库(如 jackson-databind for JSON,jackson-dataformat-xml or JAXB for XML)。
  • spring-boot-starter-web 默认包含 Jackson JSON 支持。处理 XML 需要手动添加依赖。
  • 客户端必须发送正确的 Content-Type Header。
  • 一个方法只能有一个 @RequestBody 参数。
  • 常与 @Valid 结合进行自动数据校验。

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

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

相关文章

海外平台短剧批量混剪自动剪辑智能去重与多语言适配方案解析

一、引言&#xff1a;全球化内容分发的技术挑战 在短剧出海的浪潮中&#xff0c;如何通过标准化技术流程实现「高效生产 合规分发」成为行业关键课题。本文结合 TikTok、YouTube 等平台的运营经验&#xff0c;解析基于智能去重算法、多语言字幕生成、动态元素叠加的全流程解决…

stm32 hal库 SPI使用(二)硬件SPI的HAL库函数调用

使用硬件SPI1&#xff0c;开启DMA&#xff0c;软件NSS。 1.使用硬件spi后&#xff0c;spi.c文件里会自动生成SPI_HandleTypeDef hspi1句柄&#xff0c;并且在main.c中自动使用MX_SPI1_Init&#xff08;&#xff09;函数对hsp1句柄赋值和SPI初始化 void MX_SPI1_Init(void) {h…

ES类的索引轮换

通过以下请求方法创建一个名为 “tiered-storage-policy” 的 ISM policy&#xff1a; PUT _plugins/_ism/policies/tiered-storage-policy {"policy": {"description": "Changes replica count and deletes.","schema_version": 1,…

51LA使用方法与悟空统计,网站数据分析的双重选择

在网站运营与数据分析领域&#xff0c;51LA作为国内较早的流量统计工具&#xff0c;曾为许多用户提供基础的访问数据监测服务。然而&#xff0c;随着技术的发展和用户需求的升级&#xff0c;越来越多的企业开始寻求功能更全面、体验更优的统计工具。小编今天将给大家介绍一款更…

go语言实现用户管理系统

goweb实现用户管理系统 用户后台管理系统功能描述 登录功能 支持用户通过邮箱密码和密码进行登录。对输入的邮箱和密码进行验证&#xff0c;确保用户信息的正确性。登录成功后&#xff0c;更新用户的今日登录统计信息&#xff0c;并将用户信息存入会话&#xff08;cookie&am…

Elasticsearch:RAG 和 grounding 的价值

作者&#xff1a;来自 Elastic Toms Mura 了解 RAG、grounding&#xff0c;以及如何通过将 LLM 连接到你的文档来减少幻觉。 更多阅读&#xff1a;Elasticsearch&#xff1a;在 Elastic 中玩转 DeepSeek R1 来实现 RAG 应用 想获得 Elastic 认证吗&#xff1f;查看下一期 Elast…

【黑马JavaWeb+AI知识梳理】后端Web基础01 - Maven

Maven Maven核心 Maven概述 定义&#xff1a; Maven是一款用于管理和构建Java项目的工具&#xff0c;是apache旗下的一个开源项目&#xff0c;基于项目对象模型&#xff08;POM&#xff0c;project object model&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的…

C语言易混淆知识点详解

C语言中容易混淆的知识点详解 C语言作为一门基础且强大的编程语言&#xff0c;有许多容易混淆的概念和特性。以下是C语言中一些常见易混淆知识点的详细解析&#xff1a; 1. 指针与数组 相似点&#xff1a; c 复制 下载 int arr[10]; int *ptr arr; 都可以使用[]运算符访…

MCP原理详解及实战案例(动嘴出UI稿、3D建模)

文章目录 MCP 原理介绍架构核心组件协议层传输层连接生命周期MCP与function calling: 互补关系 MCP python SDKMCP的优点 怎么用MCP&#xff1a;天气服务参考应用项目&#xff1a; REF 24年11月份&#xff0c;claude推出了模型上下文协议( MCP),作为一种潜在的解决方案&#xf…

2025年深圳杯数学建模(东三省)B题【颜色转换】原论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025年深圳杯数学建模&#xff08;东三省&#xff09;B题【颜色转换】完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成…

cpp学习笔记1--class

2年前学过cpp&#xff0c;但是一直没有用到&#xff0c;现在要读研了&#xff0c;终于要用到了&#xff0c;重新拿出来看一看&#xff0c;觉得很多东西都能在c和python上看到影子。 #include "iostream" class Person { private:std::string name;int age;public://…

基于YOLOv的目标检测训练数据构建方法研究—图像采集、标注、划分与增强一体化流程设计

在目标检测任务中,高质量的训练数据是模型性能提升的关键。本文围绕 YOLOv 系列模型,系统性地研究了目标检测训练数据的构建方法,提出了一套从图像采集、标注、数据集划分到数据增强的一体化流程设计 。通过多源图像采集策略确保样本多样性,结合 LabelImg 工具完成 VOC 格式…

SQL数据库操作大全:从基础到高级查询技巧

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01; SQL数据库操作核心语法精要 数据库基础操作 创建/删除数据库&#xff1a;CREATE DATABASE / DROP DATABASE 备份SQL Server&#xff1a;使用sp_addumpdevice和BACKUP DATABASE命令 数据库…

[2025]MySQL的事务机制是什么样的?redolog,undolog、binog三种日志的区别?二阶段提交是什么?ACID怎么保证的?主从复制的过程?

MySQL事务机制与日志系统详解 一、MySQL事务机制 1. 事务特性&#xff08;ACID&#xff09; 特性实现机制原子性(Atomicity)undo log回滚,(事务作为一个整体被执行&#xff0c;包含在其中的对数据库的操作要么全部被执行&#xff0c;要么都不执行)。一致性(Consistency)约束…

LLama-v2 权重下载

地址&#xff1a;llama模型 官方github仓库&#xff1a;llama仓库 注意点 网络代理位置&#xff1a;美国下面的国家选择 United States 克隆仓库后 运行bash download.sh输入邮箱收到的URL选择要下载的权重等待下载完成即可 有问题留言&#xff01;&#xff01;&#xff01…

zephyr OS架构下构建Nordic MCU boot

目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 MCU boot 2.1 核心功能 2.2 关键术语 2.3 重要字段介绍 3 VS-Code下创建MCU-BOOT项目 3.1 软件框架结构 3.2 创建测试项目 3.3 编译项目 3.3 固件在Flash中的分布 4 验证 4.1 烧写固件 ​ 4.2 代码…

【Mytais系列】介绍、核心概念

MyBatis 是一款优秀的 持久层框架&#xff0c;它通过简化 JDBC 操作、提供灵活的 SQL 映射能力&#xff0c;成为 Java 开发中处理数据库交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析&#xff1a; 一、MyBatis 框架概述 1. 核心定位 作用&#xff1a;将 Java 对象…

IO模型和多路复用

一、IO模型的基础理解 什么是IO? IO全称是 Input/Output(输入/输出),在计算机科学里主要指程序与外部设备(硬盘、网络、用户终端等)进行数据交换的操作。首要特点是: IO通常很慢(从CPU和内存的视角看)经常需要等待外部设备响应1. 为什么要谈IO模型? 当一个程序需要…

深入理解 Bash 中的 $‘...‘ 字符串语法糖

在 Bash 脚本编程中&#xff0c;字符串处理是不可或缺的一部分。为了让开发者更高效地处理特殊字符和控制字符&#xff0c;Bash 引入了一种独特的字符串语法糖&#xff1a;$&#xff08;带单引号的 ANSI-C 风格字符串&#xff09;。这种语法来源于 C 语言的 ANSI-C 标准&#x…

用Python打造自己的专属命令行工具

在日常的开发和使用过程中&#xff0c;我们常常会编写一些实用的Python脚本&#xff0c;比如用来批量处理文件、获取系统信息等。然而&#xff0c;每次都要输入python script_name.py来运行脚本&#xff0c;时间一长难免觉得繁琐。要是能像使用系统自带的命令&#xff08;如ls、…