1. @PathVariable
作用:从URL路径中提取动态参数(URI模板变量),常用于RESTful风格的接口设计。
使用场景:当参数是URL路径的一部分时(如资源标识符)。
用法示例:
@GetMapping("/user/{id}")
public String getUserById(@PathVariable Long id) {
// 例如:请求 /user/123,id=123
return "User ID: " + id;
}
参数说明:
-
value/name:指定绑定的路径变量名称(若方法参数名与路径变量名一致,可省略)。
-
required:是否必须提供该参数(默认
true
,若缺失会报错)。 -
默认值:
@PathVariable
不支持设置默认值(路径变量必须存在)。
高级用法:
-
多路径变量:
@GetMapping("/user/{id}/role/{role}") public String getUserRole(@PathVariable Long id, @PathVariable String role) { // 请求 /user/123/role/admin → id=123, role=admin }
-
显式指定变量名(当参数名与路径变量名不一致时):
@GetMapping("/user/{userId}") public String getUser(@PathVariable("userId") Long id) { ... }
2. @RequestParam
作用:从URL的查询参数(Query Parameters)中获取值,常用于过滤、分页等场景。
使用场景:当参数是URL中 ?
后的键值对(如 /user?name=John&age=20
)。
用法示例:
@GetMapping("/user")
public String getUserByName(@RequestParam String name) {
// 请求 /user?name=John → name=John
return "User Name: " + name;
}
参数说明:
-
value/name:指定查询参数的名称(若参数名一致可省略)。
-
required:是否必须提供(默认
true
)。 -
defaultValue:设置默认值(当参数缺失时生效)。
高级用法:
-
可选参数:
@RequestParam(required = false, defaultValue = "guest") String name
-
多值参数(数组或集合):
@RequestParam List<String> roles // 接收 ?roles=admin,user
3. 主要区别对比
特性
@PathVariable
@RequestParam
参数来源
URL路径中的模板变量(如 /user/{id}
)
URL查询参数(如 /user?name=John
)
是否必须
默认必须(required=true
)
默认必须(required=true
)
默认值支持
不支持
支持(通过 defaultValue
设置)
参数类型
简单类型(String、int等)
支持复杂类型(如对象、数组、集合)
RESTful设计
用于标识资源(如资源ID)
用于过滤、排序、分页等附加操作
4. 常见问题
问题1:路径变量与方法参数名不一致
-
解决方案:显式指定变量名。
@GetMapping("/user/{userId}") public String getUser(@PathVariable("userId") Long id) { ... }
问题2:@RequestParam参数缺失报错
-
解决方案:设置
required=false
并提供默认值。@RequestParam(required = false, defaultValue = "0") int page
问题3:处理多值参数
-
解决方案:使用集合类型接收。
@RequestParam List<String> tags // 接收 ?tags=java&tags=spring
5. 综合示例
@GetMapping("/products/{category}/search")
public String searchProducts(
@PathVariable String category, // 路径变量:/products/electronics/search
@RequestParam(required = false) String keyword, // 查询参数:?keyword=laptop
@RequestParam(defaultValue = "0") int page
) {
return "Searching " + category + " for '" + keyword + "', page=" + page;
}
总结
-
@PathVariable
:用于从URL路径中提取动态参数,适合资源标识。 -
@RequestParam
:用于从查询参数中获取值,适合可选或附加参数。 -
选择依据:根据参数是否属于资源标识的一部分决定使用哪个注解。