@requestparam专用于提取url查询参数,不处理路径变量、请求体或请求头;必须使用场景包括参数名不一致、设默认值、接收集合/数组及多值同名参数。

@RequestParam 专门用于提取 URL 中问号(?)后面的查询参数,比如 /user?name=李四&age=28 里的 name 和 age。它不处理路径变量、请求体或请求头,定位非常明确。
什么时候必须用 @RequestParam
以下情况推荐或需要显式使用该注解:
- 参数名与请求参数名不一致,例如 URL 传的是
userName,但方法参数叫name,需写@RequestParam("userName") String name - 参数可选,需设默认值或允许为空,如
@RequestParam(required = false, defaultValue = "1") int page - 接收集合或数组,如
@RequestParam List<string> tags</string>或@RequestParam String[] ids,此时必须加注解,否则 Spring 不识别 - GET 请求中含多个同名参数(如
?role=admin&role=user),用@RequestParam List<string></string>可自动收集成列表
常见易错点
这些细节容易导致 400 错误或参数为 null:
-
类型转换失败直接报错:前端传
age=abc给@RequestParam int age,会返回 HTTP 400,不会静默忽略 -
required 默认为 true:不写
required = false却没传该参数,接口直接拒绝请求 - GET 请求不能用 @RequestBody:有人误把查询参数当成 JSON 放请求体里,再用 @RequestBody 去接,结果永远为 null
-
实体类无法自动绑定查询参数:不能靠
@GetMapping("/user") public String getUser(User user)直接收参,Spring 不支持这种隐式绑定
实用写法示例
一个兼顾健壮性和可读性的典型写法:
@GetMapping("/users")
public Result<page>> listUsers(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) List<string> status
) {
// keyword 为空时按 null 处理,status 为空时为 empty list
return Result.success(userService.search(page, size, keyword, status));
}</string></page>
对应请求示例:/users?page=2&size=20&keyword=张&status=active&status=pending











