常用注解之@PathVariable与@RequestParam详解

411 阅读2分钟

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:用于从查询参数中获取值,适合可选或附加参数。

  • 选择依据:根据参数是否属于资源标识的一部分决定使用哪个注解。