Spring MVC 注解详解:@RequestBody,@RequestParam 和 @PathVariable
Spring MVC 提供了一系列注解,用于简化请求数据的获取和处理。了解并掌握这些注解的使用,对于开发RESTful API和处理HTTP请求至关重要。本文将详细介绍 @RequestBody
,@RequestParam
和 @PathVariable
注解,并附带具体的代码示例,帮助开发者更好地理解它们的用途和使用方法。
1. @RequestBody 注解
1.1 注解说明
@RequestBody
用于将 HTTP 请求体中的数据绑定到方法参数上。常用于接收 JSON 或 XML 格式的数据并将其转换为对应的 Java 对象。Spring MVC 使用消息转换机制(MessageConverter)将请求体的数据转换为 Java 对象。
1.2 使用场景
- 接收客户端发送的 JSON 数据。
- 处理复杂的数据结构,如嵌套对象等。
1.3 具体代码示例
1.3.1 接收简单对象
假设我们有一个简单的 User
类:
java
public class User { private String name; private int age; // Getters and Setters }
控制器方法如下:
java
@RestController public class UserController { @PostMapping("/user") public ResponseEntity<User> createUser(@RequestBody User user) { // 处理逻辑 // 假设这里我们只是返回接收到的用户信息 return new ResponseEntity<>(user, HttpStatus.OK); } }
请求示例:
bash
curl -X POST -H "Content-Type: application/json" -d '{"name": "John Doe", "age": 25}' http://localhost:8080/user
1.3.2 接收复杂对象
假设我们有一个复杂的 Order
对象,其中包含一个 User
和多个 Item
:
java
public class Item { private String name; private double price; // Getters and Setters } public class Order { private User customer; private List<Item> items; // Getters and Setters }
控制器方法如下:
java
@RestController public class OrderController { @PostMapping("/order") public ResponseEntity<Order> createOrder(@RequestBody Order order) { // 处理逻辑 // 假设这里我们只是返回接收到的订单信息 return new ResponseEntity<>(order, HttpStatus.OK); } }
请求示例:
bash
curl -X POST -H "Content-Type: application/json" -d '{ "customer": {"name": "John Doe", "age": 25}, "items": [{"name": "Item1", "price": 19.99}, {"name": "Item2", "price": 5.99}] }' http://localhost:8080/order
2. @RequestParam 注解
2.1 注解说明
@RequestParam
用于将请求参数(如 URL 中的查询参数)绑定到方法参数上。它支持默认值和必需参数的设置,可以处理单个参数和参数列表。
2.2 使用场景
- 处理 URL 中的查询参数。
- 处理表单数据(application/x-www-form-urlencoded)。
2.3 具体代码示例
2.3.1 获取单个请求参数
java
@RestController public class GreetingController { @GetMapping("/greeting") public ResponseEntity<String> greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name) { return new ResponseEntity<>("Hello, " + name, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/greeting?name=John
返回结果:
Hello, John
未指定参数时使用默认值:
bash
curl http://localhost:8080/greeting
返回结果:
Hello, World
2.3.2 获取多个请求参数
java
@RestController public class SearchController { @GetMapping("/search") public ResponseEntity<String> search(@RequestParam String keyword, @RequestParam int page) { return new ResponseEntity<>("Searching for " + keyword + " on page " + page, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/search?keyword=Spring&page=2
返回结果:
Searching for Spring on page 2
2.3.3 获取参数列表
java
@RestController public class FilterController { @GetMapping("/filter") public ResponseEntity<String> filter(@RequestParam List<String> categories) { return new ResponseEntity<>("Filtering categories: " + String.join(", ", categories), HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/filter?categories=books&categories=electronics&categories=clothes
返回结果:
Filtering categories: books, electronics, clothes
3. @PathVariable 注解
3.1 注解说明
@PathVariable
用于将 URL 路径中的动态部分绑定到方法参数上。它支持多种类型,包括基本数据类型和自定义类型。
3.2 使用场景
- 处理 RESTful 风格的 URL 路径参数。
- 清晰地表示资源之间的层次结构和关系。
3.3 具体代码示例
3.3.1 使用单个路径变量
java
@RestController public class UserController { @GetMapping("/users/{id}") public ResponseEntity<String> getUser(@PathVariable("id") Long userId) { return new ResponseEntity<>("User ID: " + userId, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/users/42
返回结果:
User ID: 42
3.3.2 使用多个路径变量
java
@RestController public class OrderController { @GetMapping("/users/{userId}/orders/{orderId}") public ResponseEntity<String> getOrder(@PathVariable Long userId, @PathVariable Long orderId) { return new ResponseEntity<>("User ID: " + userId + ", Order ID: " + orderId, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/users/42/orders/101
返回结果:
User ID: 42, Order ID: 101
3.3.3 使用路径变量和请求参数
java
@RestController public class ProductController { @GetMapping("/products/{productId}") public ResponseEntity<String> getProduct(@PathVariable Long productId, @RequestParam(required = false) String version) { if (version == null) { return new ResponseEntity<>("Product ID: " + productId, HttpStatus.OK); } return new ResponseEntity<>("Product ID: " + productId + " (version: " + version + ")", HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/products/123?version=2
返回结果:
Product ID: 123 (version: 2)
相关文章:

Spring MVC 注解详解:@RequestBody,@RequestParam 和 @PathVariable
Spring MVC 提供了一系列注解,用于简化请求数据的获取和处理。了解并掌握这些注解的使用,对于开发RESTful API和处理HTTP请求至关重要。本文将详细介绍 RequestBody,RequestParam 和 PathVariable 注解,并附带具体的代码示例&…...

MySQL 8 中的 sql_mode
MySQL 8 中的 sql_mode 设置:提升数据库安全性与性能 在现代数据库管理中,MySQL 是一个广泛使用的开源关系型数据库。随着数据的增长和复杂性增加,良好的数据库配置显得尤为重要。sql_mode 是 MySQL 提供的一个强大功能,它可以帮…...

13种pod的状态
13种pod的状态 生命周期 Pending:Pod被创建后进入调度阶段,k8s调度器依据pod声明的资源请求量和调度规则,为pod挑选一个适合运行的节点。当集群节点不满足pod调度需求时,pod将会处于pending状态。Running:Pod被调度到节点上,k8s将pod调度到节点上后,进入running状态。S…...

2025考研今天开始预报名!攻略请查收
2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程?需要准备哪些信息? 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段: 网上预报名时间为10月9日至10月12日(每日9࿱…...

JS中的Promise经典题目解析
这段代码很有代表性,涵盖了多个 JavaScript 知识点,特别是不同异步操作的执行优先级。 async function async1() {console.log(async1 start);await async2();console.log(async1 end); }async function async2() {console.log(async2); }console.log(s…...

【机器学习】金融预测 —— 风险管理与股市预测
我的主页:2的n次方_ 在金融领域,机器学习(ML)已经成为了不可或缺的工具。金融预测,尤其是风险管理和股市预测,涉及海量数据和复杂模式的分析,而这些正是机器学习擅长处理的领域。通过分析历…...

Bootstrap 5 分页组件使用教程
Bootstrap 5 分页组件使用教程 引言 Bootstrap 5 是一个流行的前端框架,它提供了一套丰富的组件和工具,用于快速开发响应式和移动优先的网页。分页组件是 Bootstrap 5 中用于分割长列表或数据集的重要部分,它可以帮助用户更容易地浏览内容。本文将详细介绍如何在您的项目中…...

Linux 安装 NVM 并配置 npm 加速,开发 node 项目不再愁
由于需要在 linux 机器上完成 node 项目的构建,需要安装 nodejs, 想着不同项目需要使用不同的版本,索性安装一下 nvm 吧,因为之前在 windows 上已经安装过 nvm-windows, 应该很容易上手,我尝试了官网提供的几种方式,最…...

MySQL 多条件查询
在 MySQL 中,多条件查询通常使用 WHERE 子句来指定多个条件。这些条件可以通过逻辑运算符(如 AND、OR、NOT)进行组合,以实现复杂的查询需求。以下是一些常见的多条件查询示例: 使用 AND 运算符 AND 运算符用于组合多…...

深度学习模型
1. 引言 在过去的十年间,深度学习的崛起引发了人工智能领域的革命,深刻影响了多个行业。深度学习是一种模仿人脑神经元的工作方式,通过多层神经网络进行数据处理与特征学习。其应用范围从简单的图像识别到复杂的自然语言处理、自动驾驶和医疗…...

Nexpose 6.6.271 发布下载,新增功能概览
Nexpose 6.6.271 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 26, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…...

SimpleRAG-v1.0.3:增加文件对话功能
Kimi上有一个功能,就是增加文件之后对话,比如我有如下一个私有文档: 会议主题:《如何使用C#提升工作效率》 参会人员:张三、李四、王五 时间:2024.9.26 14:00-16:00 会议内容: 1. 自动化日常任…...

数学建模算法与应用 第7章 数理统计与方法
目录 7.1 参数估计与假设检验 Matlab代码示例:均值的假设检验 7.2 Bootstrap方法 Matlab代码示例:Bootstrap估计均值的置信区间 7.3 方差分析 Matlab代码示例:单因素方差分析 7.4 回归分析 Matlab代码示例:线性回归 7.5 基…...

【网络】洪水攻击防御指南
洪水攻击防御指南 摘要: 本文深入探讨了洪水攻击的概念、危害以及防御策略。通过Java技术实现,我们将学习如何通过编程手段来增强服务器的安全性。文章不仅提供了详细的技术解读,还包含了实用的代码示例和流程图,帮助读者构建一个…...

应对Redis大Key挑战:从原理到实现
在使用Redis作为缓存或数据存储时,开发者可能会遇到大Key(Big Key)问题。大Key是指在Redis中存储的单个键值对,其值的大小非常大,可能包含大量数据或占用大量内存。大Key问题会导致性能下降、内存消耗过多以及其他潜在…...

网络安全的全面指南
目录 网络安全的全面指南1. 引言2. 网络安全的基本概念3. 网络安全框架4. 常见网络安全攻击及案例4.1 病毒与恶意软件攻击案例4.2 钓鱼攻击案例4.3 DDoS 攻击案例 5. 网络安全最佳实践5.1 强密码策略5.2 定期更新和补丁管理5.3 数据备份与恢复策略 6. 企业网络安全策略6.1 安全…...

前端性能优化全面指南
前端性能优化是提升用户体验的关键,页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法,从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。 减少 HTTP 请求 合并文件:将多…...

JavaScript-API(倒计时的实现)
基础知识 1.时间对象的使用 1.1 实例化 要获取一个时间首先需要一个关键词new了实例化 const time new Date() 如果是获取具体的具体的时间 const time new Date(2024-6-1 16:06:44) 1.2 日期对象方法 方法作用说明getFullYear()获得年份获得4…...

【C++】——继承【上】
P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:Yan. yan. …...

SpringBoot 整合 阿里云 OSS图片上传
一、OOS 简介 阿里云OSS(Object Storage Service)是一种基于云存储的产品,适用于存储和管理各种类型的文件,包括图片、视频、文档等。 阿里云OSS具有高可靠性、高可用性和低成本等优点,因此被广泛应用于各种场景&…...

内核编译 设备驱动 驱动程序
内核编译 一、内核编译的步骤 编译步骤: (linux 内核源码的顶层目录下操作 ) 1. 拷贝默认配置到 .config cp config_mini2440_td35 .config 2. make menuconfig 内核配置 make menuconfig 3. make uImage make u…...

自由学习记录
约束的泛型通配符? Java中的泛型 xiaomi和byd都继承了car,但是只是这两个类是car的子类而已,而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系 所以传入的参数整体,是car的list变形,里面的确都能存car…...

在 C# 中使用 LINQ 查询文件列表并找出最大文件
文章目录 1. 环境准备2. 创建项目3. 引入命名空间4. 示例代码5. 运行代码6. 进阶:异常处理7. 总结 在现代 C# 开发中,LINQ (Language Integrated Query) 提供了一种强大而优雅的方式来处理集合数据。本文将详细介绍如何使用 LINQ 查询文件系统中的文件&a…...

数学建模算法与应用 第6章 微分方程建模及其求解方法
目录 6.1 微分方程建模概述 6.2 发射卫星与三阶火箭建模 Matlab代码示例:火箭发射模拟 6.3 微分方程数值解法 Matlab代码示例:欧拉法与龙格-库塔法 6.4 放射性废料的处理 Matlab代码示例:放射性衰变 6.5 初值问题的Matlab数值求解 习…...

数据库的相关知识
数据库的相关知识 1.数据库能够做什么? 存储大量数据,方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析,产生新的有用信息 2.数据库作用? 存储数据、检索数据、生成新的数据 3.数据库要求? 统一、…...

Python cachetools常用缓存算法汇总
文章目录 cachetools介绍缓存操作设置数据生存时间(TTL)自定义缓存策略缓存装饰器缓存清理cachetools 超过缓存数量maxsize cachetools 使用示例 cachetools介绍 cachetools : 是一个Python第三方库,提供了多种缓存算法的实现。缓存是一种用于…...

java类和对象_成员变量方法修饰符局部变量this关键字-cnblog
java类和对象 成员变量 权限修饰符 变量类型 变量名; 成员变量可以是任意类型,整个类是成员变量的作用范围 成员变量 成员方法 权限修饰符 返回值类型 方法名() 成员方法可以有参数,也可以有返回值,用return声明 权限修饰符 private 只能在本类…...

海信和TCL雷鸟及各大品牌智能电视测评
买了型号为32E2F(9008)的海信智能的电视有一段时间了,要使用这个智能电视还真能考验你的智商。海信电视有很多优点,它的屏幕比较靓丽,色彩好看,遥控器不用对着屏幕就能操作。但也有不少缺点。 1. 海信智能电视会强迫自动更新操作…...

Linux 基本系统命令及其使用详解手册(六)
指令:mesg 使用权限:所有使用者 使用方式:mesg [y|n] 说明 : 决定是否允许其他人传讯息到自己的终端机介面 把计 : y:允许讯息传到终端机介面上。 n:不允许讯息传到终端机介面上 。 如果没有设定,则讯息传递与否则由终端机界…...

Oracle架构之段管理和区管理
文章目录 1 段1.1 简介1.1.1 定义1.1.2 分类 1.2 段空间的管理模式1.2.1 手工段空间管理(Manual Segment Space Management)1.2.2 自动段空间管理(Auto Segment Space Management) 1.3 段空间的手工管理(Manual Segmen…...