Spring MVC 注解详解:@RequestBody,@RequestParam 和 @PathVariable

news2024/10/10 3:25:16

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)

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

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

相关文章

QtDesign预览的效果与程序运行的结果不一致的解决方法

存在的问题 使用Qt designer软件设计出来的界面&#xff0c;与转换成python程序运行出来的结果不一致&#xff0c;具体看下图 Qt designer预览结果 程序运行出来的结果 原因分析 我自己的电脑是2560*1600分辨率的屏幕&#xff0c;采用的是200%的缩放比例&#xff0c;出现这种…

虚拟机没有网络怎么解决

CentOS7为例 进入虚拟网络编辑器 1.更改设置 2.选中NAT模式点击3点击移除网络 4添加网络&#xff0c;随便选一个 5.点开NAT设置&#xff0c;记住网关 6.DHCP设置&#xff0c;注意虚拟机设置ip必须在起始ip和结束ip范围内 进入虚拟机网络适配器&#xff0c;自定义选中第4步操作…

Tailwind Css的使用

1.Tailwind Css是什么 官网解释&#xff1a;Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类&#xff08;class&#xff09;名&#xff0c;然后生成相应的样式代码并写入 到一个静态 CSS 文件中。 我的理解是利用Tailwind CSS 提供的…

Element-快速入门

什么是 Element 在现代前端开发中&#xff0c;组件化的思想日益盛行&#xff0c;Element组件库作为一款流行的UI组件库&#xff0c;特别适用于基于Vue.js的项目&#xff0c;它为开发者提供了丰富的组件和良好的开发体验。 想要使用Element的组件库&#xff0c;我们需要完成下面…

基于opencv的人脸闭眼识别疲劳监测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

基于函数计算FC 部署 ComfyUI实现AI生图 的优势

基于函数计算FC 部署 ComfyUI实现AI生图 的优势 部署ComfyUI实现AI生图使用函数计算FC 一键部署ComfyUI 绘画平台的优势有哪些&#xff1f; 在文章开始之前&#xff0c;先来看一下基于函数计算FC 部署 ComfyUI实现AI生图 的大概步骤&#xff0c;整个基础部署操作比较简单。即便…

《Programming from the Ground Up》阅读笔记:p181-p216

《Programming from the Ground Up》学习第10天&#xff0c;p181-p216总结&#xff0c;总计34页。 一、技术总结 第10章主要讲计算机是如何计算的&#xff0c;如十进制、二进制、八进制、十六进制以及浮点数和负数的表示。属于比较基础的内容&#xff0c;如果有一定基础&…

ai免费写论文是原创吗?分享5款ai写作免费一键生成助手

在当今的学术研究和写作领域&#xff0c;AI技术的应用越来越广泛&#xff0c;尤其是在论文写作方面。许多AI写作工具声称能够一键生成高质量的论文&#xff0c;并且保证原创性。然而&#xff0c;这些工具是否真的能生成完全原创的论文&#xff0c;仍然是一个值得探讨的问题。 …

【函数】4.函数的单调性

本节课没有笔记示例&#xff0c;自己做好笔记&#xff01; 复合函数的单调性 最值 没讲 提醒我

【引领未来办公新风尚 —— 搭贝臻选,您的全能企业管理神器】

在这个瞬息万变的商业时代&#xff0c;每一分效率的提升都可能是超越竞争的关键。搭贝低代码平台匠心打造的“搭贝臻选”应用&#xff0c;集CRM营销管理、销售管理、采购管理、库存管理、财务管理、工单管理、人事管理及办公OA于一体&#xff0c;全方位赋能您的企业&#xff0c…

单片机闪存,闪存缓冲取,闪存延迟

一、启用闪存预取缓冲区&#xff08;FLASH_PrefetchBufferCmd (FLASH_PrefetchBuffer_Enable);&#xff09; 闪存预取缓冲区的作用&#xff1a; 在微控制器中&#xff0c;闪存是用于存储程序代码和常量数据的非易失性存储器。当微控制器执行程序时&#xff0c;需要从闪存中读取…

响应速度相关知识

在讨论 Android 性能问题的时候&#xff0c;卡顿、响应速度、ANR 这三个性能相关的知识点通常会放到一起来讲&#xff0c;因为引起卡顿、响应慢、ANR 的原因类似&#xff0c;只不过根据重要程度&#xff0c;被人为分成了卡顿、响应慢、ANR 三种&#xff0c;所以我们可以定义广义…

加快rollback事务回滚速度

背景&#xff1a; 运行一个长事务会话SQL&#xff0c;取消运行或者kill会话&#xff0c;回滚时间较长的情况。 影响到其它业务运行&#xff0c;需要尽快回滚的场景。 1.可以通过kill会话对应的操作系统进程&#xff0c;能够使用到并行恢复&#xff0c;会加快回滚速度。&…

汽车宣传动画渲染怎么做?云渲染加速汽车动画渲染

在汽车行业&#xff0c;宣传动画已成为展示新车型和技术创新的重要工具。高质量的渲染不仅能够吸引观众的眼球&#xff0c;还能有效传达汽车的性能和美学。随着技术的发展&#xff0c;云渲染技术为汽车宣传动画的渲染提供了新的可能性&#xff0c;大大提高了渲染效率和质量。 第…

一些零散的和编译相关的语法/flash-attn涉及语法扫盲

#pragma once&#xff1a;一个编译指令&#xff0c;用于防止头文件被多次包含。当编译器遇到#pragma once时&#xff0c;它会确保该头文件在一个编译单元&#xff08;一个.cpp文件及其包含的所有文件&#xff09;中只会被包含一次。即使该文件被间接包含多次&#xff0c;编译器…

JavaWeb的小结03

第2章-第3节 一、知识点 Cookie、Session、Filter过滤器、Listener。 二、目标 理解Cookie和Session的区别。 掌握Cookie和Session的基本用法。 理解Filter过滤器的作用。 三、内容分析 重点 理解Cookie和Session的区别。 掌握Cookie和Session的基本用法。 理解Filter过…

minio简单使用

文章目录 简介官方地址Linux下载安装安装服务启动关闭帮助命令 java开发minio依赖包新建项目pom配置文件配置类Service测试类运行测试 Api使用前言针对桶的操作查看某个桶是否存在创建一个桶返回桶列表删除一个桶 针对文件的操作上传文件到桶中(本地文件上传)上传文件到桶中(基…

(Linux驱动学习 - 9).设备树下platform的LED驱动

一.platform相关结构体与函数 1.匹配列表 - struct of_device_id struct of_device_id {char name[32];char type[32];/* compatible 很重要&#xff0c;需要与设备树节点的 compatible 属性一致&#xff0c;才能匹配 */char compatible[128]; const void *data; }; …

dfs 判重Sequence one——hdu 2610

目录 前言 搜索算法判重 map判重 set判重 Sequence one 问题描述 输入 输出 数据范围 样例 问题分析 重构dfs参数 递减&#xff0c;不重复 去重的优化 最终代码 前言 搜索算法判重 搜索算法判重有很多种方法&#xff0c;常见的有两种&#xff0c;map判重和set判重…

模运算和快速幂

文章目录 模运算快速幂 模运算 模运算是大数运算中的常用操作。如果一个数太大&#xff0c;无法直接输出&#xff0c;或者不需要直接输出&#xff0c;则可以对它取模&#xff0c;缩小数值再输出。取模可以防止溢出&#xff0c;这是常见的操作。 取模运算一般要求a和m的符号一…