Spring MVC 通過 HandlerMethodArgumentResolver 機制,將 HTTP 請求各維度數據自動映射為 Controller 方法參數。
@GetMapping("/users/{id}/posts/{postId}")
public ResponseEntity getPost(
@PathVariable Long id,
@PathVariable("postId") Long postId, // 參數名不同時指定
@PathVariable Map allPathVars) { // 批量獲取
// ...
}
支持正則約束:@GetMapping("/users/{id:\\d+}")。
@PostMapping("/search")
public List search(
@RequestParam(required = false, defaultValue = "10") int size,
@RequestParam(required = false) List tags, // 多值綁定 List/Set/Array
@RequestParam Map allParams, // 全量參數 Map
@RequestParam MultiValueMap mvParams) { // 多值 Map
// ...
}
關鍵屬性:value/name (參數名)、required (默認 true、缺失拋 400)、defaultValue (隱含 required=false)。
@GetMapping("/demo")
public void demo(
@RequestHeader("User-Agent") String ua,
@RequestHeader(required = false) String xRequestId,
@CookieValue(value = "JSESSIONID", required = false) String sessionId,
@CookieValue Map allCookies) {
// ...
}
public class UserForm {
private String username;
private int age;
private Address address; // 級聯綁定 address.city
// getter/setter
}
@PostMapping("/register")
public String register(UserForm form) { // 直接接收
// Spring 自動按請求參數名匹配屬性,支持巢狀對象
}
原理:ServletRequestDataBinder → DataBinder.doBind() → PropertyAccessor 反射設置屬性。
方法參數聲明即可自動注入,無需註解:
HttpServletRequest、HttpServletResponseHttpSessionLocale、TimeZoneInputStream/Reader (請求體)、OutputStream/Writer (響應體)Principal (安全主體)@GetMapping("/session-info")
public String sessionInfo(HttpServletRequest request) {
return request.getSession().getId();
}
public class CurrentUserResolver implements HandlerMethodArgumentResolver {
@Override public boolean supportsParameter(MethodParameter p) {
return p.hasParameterAnnotation(CurrentUser.class);
}
@Override public Object resolveArgument(...) {
return SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
}
// 配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override public void addArgumentResolvers(List resolvers) {
resolvers.add(new CurrentUserResolver());
}
}
// 使用
@GetMapping("/profile")
public User profile(@CurrentUser User user) { ... }
| 註解 | 數據源 | 典型場景 | 多值支持 |
|---|---|---|---|
| @PathVariable | URL 路徑佔位符 | RESTful 資源標識 | 否 |
| @RequestParam | Query String / Form Data | 表單提交、查詢參數 | List/Set/Array/Map |
| @RequestHeader | HTTP Header | 認證 Token、客戶端信息 | List/Map |
| @CookieValue | Cookie | Session 追蹤、偏好設置 | Map |
| POJO 綁定 | 綜合以上 | 複雜表單、DTO 接收 | 級聯對象、集合屬性 |