参数接收与校验
REST 接口的参数来源有多种:路径、查询串、请求体、请求头。Spring MVC 为每种来源提供了对应注解。
参数注解总览
| 注解 | 参数来源 | 示例 |
|---|---|---|
@PathVariable | URL 路径变量 | /users/{id} |
@RequestParam | 查询串 / 表单键值对 | ?name=xx&page=1 |
@RequestBody | 请求体(JSON) | POST 的 JSON 报文 |
@RequestHeader | 请求头 | Authorization: Bearer xxx |
@CookieValue | Cookie | JSESSIONID |
@ModelAttribute | 表单绑定到对象 | form 表单提交 |
@PathVariable
@GetMapping("/users/{id}/orders/{orderId}")
public Order get(@PathVariable Long id, @PathVariable Long orderId) { }
@RequestParam
@GetMapping("/users")
public List<User> list(
@RequestParam(required = false) String name, // 非必传
@RequestParam(defaultValue = "1") int page, // 默认值
@RequestParam List<Long> ids) { // ids=1&ids=2
// ...
}
@RequestBody 与 DTO
POST/PUT 的 JSON 请求体绑定到 DTO 对象:
public class UserCreateDTO {
@NotBlank(message = "用户名不能为空")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@Min(value = 0, message = "年龄不能为负")
private Integer age;
// getter / setter
}
@PostMapping("/users")
public User create(@RequestBody @Valid UserCreateDTO dto) {
return userService.create(dto);
}
@Valid 触发 JSR-303 参数校验,校验失败自动抛出 MethodArgumentNotValidException(可在全局异常处理中统一拦截,见下篇)。
常用校验注解
| 注解 | 作用 |
|---|---|
@NotNull / @NotBlank / @NotEmpty | 非空(对象 / 字符串 / 集合) |
@Size(min, max) | 字符串或集合长度 |
@Min / @Max | 数值范围 |
@Email / @Pattern(regexp) | 邮箱 / 正则 |
@Past / @Future | 日期在过去 / 未来 |
混合参数示例
一个真实接口往往同时用多种参数:
@PutMapping("/users/{id}")
public Result<User> update(
@PathVariable Long id, // 路径
@RequestHeader("X-Token") String token, // 请求头
@RequestBody @Valid UserUpdateDTO dto) { // 请求体
return Result.ok(userService.update(id, dto));
}
tip
GET 请求不要用 @RequestBody;简单参数用 @RequestParam,复杂对象直接省略注解也能绑定查询串字段。