深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用
文章目录
- 1. 引言
- 2. @PathVariable:处理路径变量
- 2.1 简介
- 2.2 使用示例
- 3. @RequestParam:处理请求参数
- 3.1 简介
- 3.2 使用示例
- 4. @RequestBody:处理请求体
- 4.1 简介
- 4.2 使用示例
- 5. 多个注解的组合使用
- 6. 参数绑定的原理
- 6.1 HandlerMethodArgumentResolver的工作流程
- 6.2 扩展HandlerMethodArgumentResolver
- 7. 参数的验证与异常处理
- 8. 性能优化与拓展
- 8.1 参数绑定的性能优化
- 8.2 拓展参数解析器
- 9. 总结

🎉深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用
- ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
- ✨博客主页:IT·陈寒的博客
- 🎈该系列文章专栏:架构设计
- 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
- 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
- 📜 欢迎大家关注! ❤️
1. 引言
在Spring Boot中,通过使用注解来处理请求参数是极为常见的场景。@PathVariable
、@RequestParam
、@RequestBody
是其中的三个核心注解,它们分别用于处理路径变量、请求参数和请求体。本文将深入解析这三个注解的正确使用方式,通过代码示例和详细解释,帮助读者更好地理解在不同场景下如何正确使用这些注解。
2. @PathVariable:处理路径变量
2.1 简介
@PathVariable
注解用于从请求路径中获取变量的值。它常用于RESTful风格的请求,将路径中的一部分作为参数传递给方法。
2.2 使用示例
@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{userId}")public ResponseEntity<User> getUserById(@PathVariable Long userId) {// 根据用户ID查询用户信息User user = userService.getUserById(userId);if (user != null) {return new ResponseEntity<>(user, HttpStatus.OK);} else {return new ResponseEntity<>(HttpStatus.NOT_FOUND);}}
}
在上述示例中,@GetMapping("/{userId}")
表示处理/api/users/{userId}
路径的GET请求,并通过@PathVariable
注解将userId
作为方法参数接收。
3. @RequestParam:处理请求参数
3.1 简介
@RequestParam
注解用于从请求中获取查询参数。它适用于处理表单提交或URL中的查询参数。
3.2 使用示例
@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/search")public ResponseEntity<List<User>> searchUsers(@RequestParam String username,@RequestParam(required = false) Integer age) {// 根据用户名和年龄查询用户列表List<User> users = userService.searchUsers(username, age);return new ResponseEntity<>(users, HttpStatus.OK);}
}
在上述示例中,@GetMapping("/search")
表示处理/api/users/search
路径的GET请求,并通过@RequestParam
注解分别接收username
和可选参数age
。
4. @RequestBody:处理请求体
4.1 简介
@RequestBody
注解用于接收请求体中的数据,通常用于处理POST请求,将请求体的JSON或XML数据转化为Java对象。
4.2 使用示例
@RestController
@RequestMapping("/api/users")
public class UserController {@PostMappingpublic ResponseEntity<User> createUser(@RequestBody UserRequest userRequest) {// 从请求体中创建用户User user = userService.createUser(userRequest);return new ResponseEntity<>(user, HttpStatus.CREATED);}
}
在上述示例中,@PostMapping
表示处理/api/users
路径的POST请求,并通过@RequestBody
注解将请求体中的JSON数据映射为UserRequest
对象。
5. 多个注解的组合使用
在实际应用中,我们可能需要同时使用多个注解来处理不同类型的参数。以下是一个示例,演示了@PathVariable
、@RequestParam
和@RequestBody
的组合使用:
@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{userId}")public ResponseEntity<User> getUserById(@PathVariable Long userId) {// 根据用户ID查询用户信息User user = userService.getUserById(userId);if (user != null) {return new ResponseEntity<>(user, HttpStatus.OK);} else {return new ResponseEntity<>(HttpStatus.NOT_FOUND);}}@GetMapping("/search")public ResponseEntity<List<User>> searchUsers(@RequestParam String username,@RequestParam(required = false) Integer age) {// 根据用户名和年龄查询用户列表List<User> users = userService.searchUsers(username, age);return new ResponseEntity<>(users, HttpStatus.OK);}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody UserRequest userRequest) {// 从请求体中创建用户User user = userService.createUser(userRequest);return new ResponseEntity<>(user, HttpStatus.CREATED);}
}
在这个示例中,getUserById
方法使用了@PathVariable
,searchUsers
方法使用了@RequestParam
,而createUser
方法使用了@RequestBody
,通过这种方式,我们可以处理不同类型的请求参数。
6. 参数绑定的原理
了解注解的正确使用还需要了解参数绑定的原理。Spring Boot通过
HandlerMethodArgumentResolver
来完成参数绑定,它负责将请求中的参数值映射到方法的参数上。
6.1 HandlerMethodArgumentResolver的工作流程
-
解析参数注解: Spring Boot首先会遍历方法的参数,识别出使用了哪些注解,如
@PathVariable
、@RequestParam
、@RequestBody
等。 -
查找对应的HandlerMethodArgumentResolver: 根据参数注解,Spring Boot会查找合适的
HandlerMethodArgumentResolver
,每个注解对应一个HandlerMethodArgumentResolver
。 -
参数解析: 通过找到的
HandlerMethodArgumentResolver
,Spring Boot会将请求中的参数值解析成方法参数的实际值。
6.2 扩展HandlerMethodArgumentResolver
在某些情况下,我们可能需要自定义参数的解析逻辑。这时,可以通过实现HandlerMethodArgumentResolver
接口来扩展Spring Boot的参数解析器。
以下是一个简单的示例,展示了如何扩展一个自定义的参数解析器:
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.getParameterType().equals(CustomType.class);}@Overridepublic Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception {// 自定义解析逻辑// ...return customValue;}
}
在上述示例中,supportsParameter
方法用于判断是否支持解析特定类型的参数,而resolveArgument
方法则实现了具体的参数解析逻辑。
7. 参数的验证与异常处理
在处理参数的同时,参数的验证也是一个重要的方面。Spring Boot提供了强大的参数验证功能,通过@Valid
注解和BindingResult
对象,我们能够对参数进行验证,并处理验证失败的情况。
以下是一个简单的参数验证示例:
@RestController
@RequestMapping("/api/users")
public class UserController {@PostMappingpublic ResponseEntity<User> createUser(@Valid @RequestBody UserRequest userRequest, BindingResult result) {// 参数验证if (result.hasErrors()) {// 处理验证失败的情况return new ResponseEntity<>(HttpStatus.BAD_REQUEST);}// 从请求体中创建用户User user = userService.createUser(userRequest);return new ResponseEntity<>(user, HttpStatus.CREATED);}
}
在上述示例中,通过@Valid
注解标记了UserRequest
参数,同时使用BindingResult
对象来处理验证失败的情况。
8. 性能优化与拓展
8.1 参数绑定的性能优化
在实际应用中,当请求参数较多或者复杂时,参数绑定的性能可能成为一个关注点。可以通过以下方式进行性能优化:
-
使用基本类型: 在可能的情况下,使用基本类型而非包装类型,减少自动装箱的开销。
-
避免复杂对象: 尽量避免使用过于复杂的对象作为方法参数,减少反射和复杂对象创建的开销。
8.2 拓展参数解析器
除了扩展参数解析器外,还可以通过自定义注解和HandlerMethodArgumentResolver
来实现更灵活的参数处理逻辑。例如,定义一个自定义注解@CurrentUser
,并通过HandlerMethodArgumentResolver
将当前用户绑定到方法参数上。
9. 总结
本文深入解析了Spring Boot中的注解@PathVariable
、@RequestParam
、@RequestBody
的正确使用方式。通过代码示例和详细解释,读者能够更好地理解在不同场景下如何使用这些注解。同时,了解了参数绑定的原理和性能优化的相关内容,以及如何扩展和拓展Spring Boot中的参数处理逻辑。在实际应用中,根据具体需求选择合适的注解和处理方式,能够提高代码的可读性和可维护性,更好地发挥Spring Boot的优势。
🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:
- 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
- 【Java学习路线】2023年完整版Java学习路线图
- 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
- 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
- 【数据结构学习】从零起步:学习数据结构的完整路径
相关文章:

深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用
文章目录 1. 引言2. PathVariable:处理路径变量2.1 简介2.2 使用示例 3. RequestParam:处理请求参数3.1 简介3.2 使用示例 4. RequestBody:处理请求体4.1 简介4.2 使用示例 5. 多个注解的组合使用6. 参数绑定的原理6.1 HandlerMethodArgument…...
Qt Location中加载地图对象
在Qt Location中加载地图对象,你可以按照以下步骤进行操作: 1,首先,确保你已经安装了Qt Location模块,并在项目中包含了相应的头文件。在项目文件(.pro)中添加以下行: QT locatio…...
4-Docker命令之docker ps
1.docker ps介绍 docker ps命令是用来列出容器的相关信息 2.docker ps用法 docker ps [参数] [rootcentos79 ~]# docker ps --helpUsage: docker ps [OPTIONS]List containersAliases:docker container ls, docker container list, docker container ps, docker psOptions…...
你在地铁上修过bug吗?
作为技术人员,有没有遇到下班路上收到老板电话,系统故障,然后地铁上掏出电脑,修bug的场景。自己负责的业务线上出现问题,负责人心里是很慌的,在这种心理状态下做事很容易二次犯错,造成更大的问题…...

CPU、MCU、MPU、DSP、FPGA各是什么?有什么区别?
1、CPU 中央处理器,简称 CPU(Central Processing Unit),中央处理器主要包括两个部分,即控制器、运算器,其中还包括高速缓冲存储器及实现它们之间联系的数据、控制的总线。 电子计算机三大核心部件就是CPU…...
SpringBoot之logback 在Linux系统上启动的时候,设置日志按日期分割并设置指定时间自动清除日志
一、在src/main/resources/下创建logback-spring.xml文件 <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 日志存放路径 --><property name"log.path" value"/home/xmmc/logs" /><!-- 日志…...

OpenHarmony北向-让更广泛的应用开发者更容易参与
一、标准系统的体验 按照官方文档指导,这样操作,OH标准系统开发板就可以运行开发者开发的OpenHarmony应用了。 二、实际情况 按照开发文档上的说明,肯定是装不上的。因为OH不同的发行版,不同发行板不同的设备,IDE&…...

数据结构之归并排序及排序总结
目录 归并排序 归并排序的时间复杂度 排序的稳定性 排序总结 归并排序 归并排序大家只需要掌握其递归方法即可,非递归方法由于在某些特殊场景下边界难控制,我们一般很少使用非递归实现归并排序。那么归并排序的递归方法我们究竟是怎样实现呢ÿ…...

仿windows12网盘,私有云盘部署教程,支持多种网盘
仿windows12网盘,私有云盘部署教程,支持多种网盘 资源宝分享:www.httple.net 视频教程:https://www.bilibili.com/video/BV1m64y1G7Bq/ 宝塔部署方式: 1.验证是否安装jdk,没有安装请看安装教程 推荐安装jdk8(注意您…...
深度学习 时间序列回归学习笔记
目录 常用的深度学习时间序列回归模型: ARIMA模型 ETS模型 效果评估...

【postgresql】ERROR: INSERT has more expressions than target columns
执行下面sql insert into apply_account_cancellation3 select * from pply_account_cancellation; 返回下面错误信息 insert into apply_account_cancellation3 select * from apply_account_cancellation > ERROR: INSERT has more expressions than target colu…...
Android Kotlin语言下的文件存储
目录 将数据存储到文件中 创建文件和保存数据 读取文件 SharedPreferences存储 存储数据到SharedPreferences中 Context类中的getSharedPreferences()方法 Activity类中的getPreferences()方法 从SharedPreferences中读取数据 SQLite数据库存储 创建数据库 调用数据…...

Verilog 入门(八)(验证)
文章目录 编写测试验证程序波形产生值序列重复模式 测试验证程序实例从文本文件中读取向量实例:时序检测器 测试验证程序用于测试和验证设计方法的正确性。Verilog 提供强有力的结构来说明测试验证程序。 编写测试验证程序 测试验证程序有三个主要目的:…...
vue3 vue-router 导航守卫 (五)
在Vue 3中,导航守卫仍然是一个重要的概念,用于在路由切换时执行一些特定的逻辑。Vue Router提供了多个导航守卫,包括全局守卫、路由独享守卫和组件内守卫。可以在路由切换时执行一些特定的逻辑,例如身份验证、权限控制、数据加载等…...
Git命令---查看远程仓库
介绍 使用git命令查看绑定的远程仓库。 命令 git remote -v...

12.8作业
1. 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…...

算法:有效的括号(入栈出栈)
时间复杂度 O(n) 空间复杂度 O(n∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含 6 种括号 /*** param {string} s* return {boolean}*/ var isValid function(s) {const map {"(":")","{":"}","["…...
vxworks常用的指令归纳
目的:方便自己查阅 tftpboot 0x10000000 vxworks bootelf 0x10000000 ifconfig "gem0 dowm" ifconfig "gem0 inet 192.168.0.81" ifconfig "gem0 lladdr 01:02:03:04:05:06:07" ifconfig "gem0 up" ld 0,1,"…...

线性回归实战
3.1 使用正规方程进行求解 3.1.1 简单线性回归 公式 : y w x b y wx b ywxb 一元一次方程,在机器学习中一元表示一个特征,b表示截距,y表示目标值。 使用代码进行实现: 导入包 import numpy as np import matp…...

stm32 使用18B20 测试温度
用18b20 测试温度是非常常用的,不过18B20的调试不是这么容易的,有些内容网上很多的,不再重复说了,我先把波形说一下,再说程序部分: 整个都温度数据的顺序是: 1.700uS的低电平复位并测试18B20的…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...