在 Spring Boot 中,参数注解用于将 HTTP 请求中的数据(如路径变量、请求参数、请求体等)绑定到控制器方法的参数上,简化了参数获取的流程。
1. @PathVariable
- 作用:获取 URL 路径中的变量(RESTful 风格路径参数)。
- 场景:用于获取 URL 中动态部分的值,如
/users/{id}中的id。
@RestController
@RequestMapping("/users")
public class UserController {
// 获取路径中的id参数
@GetMapping("/{id}")
public String getUserById(@PathVariable Long id) {
return "获取用户ID:" + id;
}
// 多路径参数(名称不一致时需指定value)
@GetMapping("/{userId}/orders/{orderId}")
public String getOrder(
@PathVariable("userId") Long uId, // 路径变量userId绑定到uId
@PathVariable Long orderId // 名称一致可省略value
) {
return "用户ID:" + uId + ",订单ID:" + orderId;
}
}
2. @RequestParam
- 作用:获取 URL 中
?后的请求参数(查询参数)。 - 场景:如
/search?keyword=java&page=1中的keyword和page
@RestController
@RequestMapping("/search")
public class SearchController {
// 基本使用
@GetMapping
public String search(
@RequestParam String keyword, // 必传参数,不传会报错
@RequestParam(defaultValue = "1") int page, // 可选参数,默认值1
@RequestParam(required = false) Integer size // 可选参数,可传null
) {
return "关键词:" + keyword + ",页码:" + page + ",每页大小:" + size;
}
}
. @RequestBody
- 作用:获取 HTTP 请求体中的数据(通常是 JSON/XML 格式),并绑定到 Java 对象。
- 场景:POST/PUT 请求中提交复杂数据(如表单提交、JSON 数据)。
// 定义实体类
public class User {
private Long id;
private String name;
private Integer age;
// 省略getter、setter、构造方法
}
@RestController
@RequestMapping("/users")
public class UserController {
// 接收JSON请求体并转换为User对象
@PostMapping
public String createUser(@RequestBody User user) {
return "创建用户:" + user.getName() + ",年龄:" + user.getAge();
}
}
请求示例(JSON 格式):
// POST /users 的请求体
{
"id": 1,
"name": "张三",
"age": 20
}
@RequestHeader
- 作用:获取 HTTP 请求头中的信息。
- 场景:获取
Content-Type、Token等请求头参数。
@RestController
public class HeaderController {
@GetMapping("/header")
public String getHeader(
@RequestHeader("Content-Type") String contentType,
@RequestHeader(value = "Token", required = false) String token
) {
return "Content-Type:" + contentType + ",Token:" + token;
}
}
@CookieValue
- 作用:获取请求中的 Cookie 值。
- 场景:需要从 Cookie 中获取会话信息等场景。
@RestController
public class CookieController {
@GetMapping("/cookie")
public String getCookie(@CookieValue(value = "SESSIONID", required = false) String sessionId) {
return "会话ID:" + sessionId;
}
}
@ModelAttribute
- 作用:将请求参数(表单数据)绑定到 Java 对象(支持嵌套对象)。
- 场景:表单提交时,自动封装参数到实体类。
// 实体类User(同上)
@RestController
@RequestMapping("/form")
public class FormController {
// 表单参数绑定到User对象
@PostMapping("/user")
public String submitForm(@ModelAttribute User user) {
return "提交的用户:" + user.getName() + ",年龄:" + user.getAge();
}
}
表单提交示例:
<form action="/form/user" method="post">
<input name="name" value="张三">
<input name="age" value="20">
<button type="submit">提交</button>
</form>
@MatrixVariable
- 作用:获取 URL 中的矩阵变量(用
;分隔的参数)。 - 注意:默认禁用,需在配置类中开启。
// 开启矩阵变量(配置类)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setRemoveSemicolonContent(false); // 不移除分号后的内容
}
}
// 使用示例
@RestController
public class MatrixController {
@GetMapping("/cars/{path}")
public String getCars(
@MatrixVariable("color") String color, // 获取color矩阵变量
@MatrixVariable("brand") List<String> brands, // 多个值
@PathVariable String path
) {
return "路径:" + path + ",颜色:" + color + ",品牌:" + brands;
}
}
请求示例:
访问 /cars/abc;color=red;brand=bmw;brand=tesla
返回:路径:abc,颜色:red,品牌:[bmw, tesla]
总结
Spring Boot 的参数注解简化了请求数据的获取,核心注解包括:
- 路径参数:
@PathVariable - 查询参数:
@RequestParam - 请求体:
@RequestBody - 请求头:
@RequestHeader - Cookie:
@CookieValue - 表单绑定:
@ModelAttribute
根据请求类型(GET/POST 等)和数据位置(路径 / 请求体 / 头)选择合适的注解,可大幅提升开发效率。
特别注意:@PathVariable 是 Spring Boot 中用于用于获取 URL 路径中动态参数的注解,主要用于 RESTful 风格的接口设计,通过它可以轻松获取 URL 路径中的变量值。
核心特点
- 作用:从 URL 路径中提取动态参数(如
/users/{id}中的id) - 适用场景:RESTful API 中获取资源标识(ID、名称等)
- 绑定方式:通过参数名与路径变量名匹配自动绑定
基本使用方法
1. 简单示例(名称一致)
当方法参数名与 URL 路径中的变量名一致时,可以直接使用:
@RestController
@RequestMapping("/users")
public class UserController {
// URL 路径:/users/123
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
// id 会自动获取路径中的 123
return "获取用户ID:" + id;
}
}
访问 http://localhost:8080/users/123,会返回 获取用户ID:123。
2. 名称不一致时指定绑定关系
如果方法参数名与路径变量名不同,需要通过 value 属性指定对应关系
@GetMapping("/{userId}/orders/{orderId}")
public String getOrder(
@PathVariable("userId") Long uId, // 路径变量 userId 绑定到 uId
@PathVariable Long orderId // 名称一致,直接绑定
) {
return "用户ID:" + uId + ",订单ID:" + orderId;
}
访问 http://localhost:8080/users/456/orders/789,会返回 用户ID:456,订单ID:789。
3. 可选参数(允许为 null)
默认情况下,@PathVariable 修饰的参数是必传的,如果路径中没有该变量,会报错。
若需要设置为可选参数,可添加 required = false(但需确保路径设计支持可选):
// 支持 /users 和 /users/123 两种路径
@GetMapping({"/", "/{id}"})
public String getUserInfo(@PathVariable(required = false) Long id) {
if (id == null) {
return "获取所有用户";
} else {
return "获取用户ID:" + id;
}
}
4. 接收多个参数并处理
可以同时获取多个路径变量,并进行业务处理:
@GetMapping("/products/{category}/{id}")
public String getProduct(
@PathVariable String category,
@PathVariable Long id
) {
return "商品分类:" + category + ",商品ID:" + id;
}
访问 http://localhost:8080/products/electronics/100,返回 商品分类:electronics,商品ID:100。
注意事项
- 路径变量名区分大小写:URL 中的
{UserId}和代码中的@PathVariable("userId")会匹配失败。 - 参数类型自动转换:Spring 会自动将路径中的字符串转换为方法参数的类型(如
String→Long),转换失败会抛TypeMismatchException。 - 配合
@RequestMapping使用:通常与@GetMapping、@PostMapping等注解配合,定义包含变量的路径。
总结
@PathVariable 是 RESTful 接口开发中的核心注解,通过它可以优雅地从 URL 路径中提取动态参数,使代码更简洁、语义更清晰。使用时需注意参数名匹配和类型转换问题,确保路径设计与参数接收逻辑一致。
@PathVariable 和 @RequestParam 是 Spring Boot 中用于获取请求数据的两个核心注解,但它们的应用场景和使用方式有明显区别:
核心区别
| 维度 | @PathVariable | @RequestParam |
|---|---|---|
| 数据位置 | URL 路径中(如 /users/{id} 中的 id) | URL 问号后的查询参数(如 ?page=1&size=10) |
| 适用场景 | RESTful 风格的路径参数(资源标识) | 过滤、分页、搜索等可选参数 |
| URL 格式 | /资源/{变量1}/{变量2} | /资源?参数1=值1&参数2=值2 |
| 是否必传 | 默认必传(可通过 required=false 设为可选) | 默认必传(可通过 required=false 设为可选) |
代码示例对比
1. @PathVariable 示例(路径参数)
用于获取 URL 路径中的动态变量,通常是资源的唯一标识(如 ID):
@RestController
@RequestMapping("/users")
public class UserController {
// 访问路径:/users/123
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
return "获取用户ID:" + id; // id = 123
}
}
2. @RequestParam 示例(查询参数)
用于获取 URL 中 ? 后的键值对参数,通常是过滤或分页条件:
@RestController
@RequestMapping("/users")
public class UserController {
// 访问路径:/users?page=1&size=10
@GetMapping
public String getUsers(
@RequestParam int page,
@RequestParam int size
) {
return "第" + page + "页,每页" + size + "条"; // page=1, size=10
}
}
其他关键区别
- 参数格式:
@PathVariable的参数是 URL 路径的一部分,必须符合路径语法(不能包含?&=等特殊字符)。@RequestParam的参数是键值对形式,多个参数用&分隔,支持更灵活的取值。
- 使用场景:
- 当参数是资源的唯一标识(如 ID、名称)时,用
@PathVariable(符合 RESTful 设计)。 - 当参数是可选的过滤条件(如搜索关键词、分页参数)时,用
@RequestParam。
- 当参数是资源的唯一标识(如 ID、名称)时,用
- 默认值处理:
- 两者都可通过
defaultValue设置默认值,但@PathVariable需要路径支持(如/users/{id:.*}?允许空值)。
- 两者都可通过
// @RequestParam 设置默认值
@GetMapping("/list")
public String list(@RequestParam(defaultValue = "1") int page) { ... }
// @PathVariable 设置默认值(需路径支持)
@GetMapping({"/info", "/info/{id}"})
public String info(@PathVariable(required = false, defaultValue = "0") Long id) { ... }