Spring MVC:@PathVariable 注解详解

Spring MVC @PathVariable 注解详解

适用范围:Spring MVC / Spring Boot Web(@RestController / @Controller

@PathVariable 用于将 URL 模板变量(URL path 中的占位符)绑定到控制器处理方法的参数上。它是实现 RESTful 风格接口的核心注解之一。


1. 基本用法

@RequestMapping(或其变体如 @GetMapping, @PostMapping)的路径中使用 {variableName} 定义占位符,然后在方法参数中使用 @PathVariable 引用它。

1.1 简单示例

java 复制代码
@GetMapping("/users/{id}")
public String getUserById(@PathVariable("id") Long userId) {
    return "User ID: " + userId;
}
  • URL 示例GET /users/123
  • 结果userId 参数将被赋值为 123

1.2 参数名一致时可省略

如果路径变量名与方法参数名完全一致,可以省略注解中的名称:

java 复制代码
@GetMapping("/users/{id}")
public String getUserById(@PathVariable Long id) { // 自动匹配 {id}
    return "User ID: " + id;
}

2. 实例

java 复制代码
@PostMapping("/delete/{documentId}")
public BaseResponse<String> deleteDocument(@PathVariable Long documentId) {
    // ...
    knowledgeDocumentService.deleteDocument(documentId);
    return BaseResponse.success(MessageConstant.DELETE_SUCCESS);
}
  • 请求方式POST /delete/1001
  • 含义 :URL 最后的 1001 会被自动提取并赋值给 documentId

3. 常见属性

属性 类型 默认值 说明
value / name String "" 指定绑定的路径变量名称。
required boolean true 是否必须包含该路径变量。如果为 true 且路径中缺失,会报 404。

示例:

java 复制代码
@GetMapping("/users/{id}")
public String demo(@PathVariable(name = "id", required = true) Long userId) {
    return "ok";
}

4. @PathVariable vs @RequestParam

这两者经常被混淆,它们的区别主要在于 参数在 URL 中的位置

特性 @PathVariable @RequestParam
位置 URL 路径的一部分 (Path) URL 查询字符串 (Query String)
风格 RESTful 风格 传统查询参数风格
示例 URL /users/123 /users?id=123
定义方式 @GetMapping("/users/{id}") @GetMapping("/users")
场景 标识资源 ID、分类等固定结构 过滤、排序、分页、可选搜索条件

4.1 前端请求代码示例(对比)

下面用前端常见的 fetch(原生)与 axios(第三方库)分别演示两种传参方式。

A. @PathVariable:参数在路径中

后端接口示例:

java 复制代码
// GET /admin/knowledge/detail/{documentId}
@PostMapping("/detail/{documentId}")
public BaseResponse<KnowledgeDocument> getDocumentDetail(@PathVariable Long documentId) {
    // ...
}

前端(fetch):

js 复制代码
const documentId = 1001;
fetch(`/admin/knowledge/detail/${documentId}`, {
  method: 'POST',
});

前端(axios):

js 复制代码
import axios from 'axios';

const documentId = 1001;
axios.post(`/admin/knowledge/detail/${documentId}`);
B. @RequestParam:参数在查询字符串中

后端接口示例:

java 复制代码
// POST /admin/knowledge/list?current=1&pageSize=10&name=xxx&type=pdf
@PostMapping("/list")
public BaseResponse<Page<KnowledgeDocument>> listDocuments(
        @RequestParam(defaultValue = "1") int current,
        @RequestParam(defaultValue = "10") int pageSize,
        @RequestParam(value = "name", required = false) String name,
        @RequestParam(value = "type", required = false) String type) {
    // ...
}

前端(fetch):

js 复制代码
const params = new URLSearchParams({
  current: '1',
  pageSize: '10',
  name: '饲养指南',
  type: 'pdf',
});

fetch(`/admin/knowledge/list?${params.toString()}`, {
  method: 'POST',
});

前端(axios):

js 复制代码
import axios from 'axios';

axios.post('/admin/knowledge/list', null, {
  params: {
    current: 1,
    pageSize: 10,
    name: '饲养指南',
    type: 'pdf',
  },
});

5. 进阶用法

5.1 多个路径变量

java 复制代码
@GetMapping("/category/{catId}/product/{prodId}")
public String getProduct(
        @PathVariable Long catId,
        @PathVariable Long prodId) {
    return "Category: " + catId + ", Product: " + prodId;
}

5.2 Map 接收所有路径变量(可选)

当路径变量较多时,可以用 Map 一次性接收:

java 复制代码
@GetMapping("/users/{userId}/orders/{orderId}")
public String demo(@PathVariable Map<String, String> vars) {
    return vars.toString();
}

6. 一句话总结

  • @PathVariable 是从 URL 路径 取值(如 /api/item/1)。
  • 它让 URL 看起来更简洁、更符合 RESTful 规范。
  • 操作特定资源(查单条、删除、更新)时,通常优先选 @PathVariable
相关推荐
蚰蜒螟几秒前
一次 Spring AOP 与定时任务引发的死锁排查实录
java·spring·firefox
TeamDev几秒前
JxBrowser 9.3.1 版本发布啦!
java·前端·javascript·c#·混合应用·jxbrowser·浏览器控件
Java爱好狂.19 分钟前
Java就业需要学习哪些内容?
spring·程序员·springboot·架构师·java面试·java面试题·java八股文
程序猿乐锅35 分钟前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
yeflx1 小时前
速腾Airy雷达使用记录
java·服务器·网络
乐之者v1 小时前
AI编程 -- Agents.md 的简单示例
java·ai编程
无风听海1 小时前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式
geovindu2 小时前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
listening7772 小时前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring
AC赳赳老秦2 小时前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw