@PathVariable 是 Spring MVC 中提取 RESTful URL 动态路径段的最直接方式,通过花括号 {} 定义变量并自动绑定到方法参数,支持类型转换、显式命名、多变量组合、正则约束及与 @RequestParam 混合使用。

在 Spring MVC 中,@PathVariable 是提取 RESTful URL 中动态路径段最直接的方式——它把 URL 路径里用花括号 {} 标出的部分,自动绑定到控制器方法的参数上,无需手动解析字符串或处理请求路径。
基本用法:匹配单个路径变量
比如要获取用户 ID:/users/123 中的 123,只需在映射路径中用 {id} 占位,并用 @PathVariable 注解对应参数:
- 控制器方法写法:
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id) {
// id 自动转为 Long 类型,值为 123
return "user-detail";
}
- Spring 会自动完成类型转换(支持 String、基本类型及其包装类、枚举、日期等);
- 参数名默认与花括号内名称一致,也可显式指定:
@PathVariable("userId") Long id; - 若路径变量名与参数名不同,必须用
value属性明确指定。
多个路径变量:按需组合提取
RESTful 路径常含多个层级变量,例如 /orders/2024/1001 表示年份和订单号:
立即学习“Java免费学习笔记(深入)”;
- 映射路径写成
/orders/{year}/{orderId}; - 方法参数依次标注
@PathVariable,顺序无关,靠名字匹配:
@GetMapping("/orders/{year}/{orderId}")
public String getOrder(@PathVariable Integer year, @PathVariable String orderId) {
// year=2024,orderId="1001"
return "order-view";
}
- 所有
@PathVariable参数都必须有对应路径段,否则抛IllegalStateException; - 不支持部分可选路径变量,如
/users/{id}/profile中{id}不可省略。
配合正则表达式做路径约束
防止非法输入进入业务逻辑,可在路径变量后加正则限定,比如只允许数字 ID:
- 写法:
@GetMapping("/users/{id:\d+}"); - 这样访问
/users/abc会直接返回 404(不匹配任何 handler),而非进入方法再校验; - 多个变量可分别加正则:
/products/{category:[a-z]+}/{id:\d+}; - 注意正则写在花括号内、冒号后面,且整个路径段必须完全匹配该正则。
与 @RequestParam 混合使用要分清场景
路径变量用于资源标识(如 /users/123),查询参数用于筛选或修饰(如 ?format=json):
- 正确混合示例:
/posts/{postId}/comments?page=2&size=10; - 对应方法:
getComments(@PathVariable Long postId, @RequestParam int page, @RequestParam int size); - 别把本该是路径变量的内容塞进 query:/users?id=123 是非 RESTful 的,应改为 /users/123;
- 路径变量不可为空(URL 中必须存在),而
@RequestParam可设required = false。
掌握这几种常见用法,就能干净利落地处理绝大多数 RESTful 路径参数提取需求,代码清晰、语义明确、维护成本低。


















