Spring MVC 自定义参数解析器HandlerMethodArgumentResolver
HandlerMethodArgumentResolver 接口定义了方法参数的解析规则,可实现自定义参数的自动绑定。
接口定义
Java
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception;
}
核心方法
| 方法 | 作用 |
|---|---|
| supportsParameter | 判断是否支持该参数类型 |
| resolveArgument | 解析并返回参数值 |
自定义参数解析器
Java
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(CurrentUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpSession session = request.getSession(false);
if (session != null) {
return session.getAttribute("currentUser");
}
return null;
}
}
自定义注解标记
Java
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
控制器使用
Java
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/profile")
public User getProfile(@CurrentUser User user) {
return user;
}
}
注册参数解析器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new CurrentUserArgumentResolver());
}
}
内置解析器
| 解析器 | 支持参数 |
|---|---|
| RequestParamMethodArgumentResolver | @RequestParam |
| PathVariableMethodArgumentResolver | @PathVariable |
| ServletModelAttributeMethodArgumentResolver | @ModelAttribute |
| RequestResponseBodyMethodProcessor | @RequestBody |
解析器按注册顺序匹配,自定义解析器优先于默认解析器。
要点总结
- supportsParameter 返回 true 时才调用 resolveArgument
- 可配合自定义注解标记需要解析的参数
- 通过 WebMvcConfigurer#addArgumentResolvers 注册
- 返回值直接作为方法参数值注入
📝 发现内容有误?点击此处直接编辑