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)

相关推荐
num_killer3 小时前
小白的Langchain学习
java·python·学习·langchain
期待のcode4 小时前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐4 小时前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲4 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红4 小时前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥4 小时前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v4 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地5 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209255 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei5 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot