HandlerMethodArgumentResolver 接口详情
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
@Nullable
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
supportsParameter
表示当前参数解析器能够处理什么样参数,当为true时才会执行resolveArgument
方法。
resolveArgument
实参的具体处理方法。
应用场景
- Spring中@RequestParam,@PathVariable,@RequestBody注解的解析器等等.
- 可以通过自定义注解在参数列表中自动注入当前登录用户.
代码实现
- 自定义注解
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentUser {
}
- 自定义参数解析,若参数中有我们自定义@CurrentUser注解时,将当前登录用户信息保存至其中
@Componetn
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Resource
private RedisUtils redisUtils;
public boolean supportsParameter(MethodParameter parameter) {
// 当参数中使用了我们的自定义注解的时候
if (parameter.hasParameterAnnotation(CurrentUser.class)) {
return true;
}
return false;
}
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
String token = httpServletRequest.getHeader("token");
if(token == null){
throw new CustomException(ResultStatus.ERROR.getCode(), "token不能为空");
}
Object obj = redisUtils.get(token);
if(obj == null){
throw new CustomException(ResultStatus.ERROR.getCode(), "token失效");
}
return (SysUser)obj;
}
}
- 将参数解析器添加至Application容器中
@Configuration
public class ApplicationConfigurer extends WebMvcConfigurerAdapter {
@Resource
private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(currentUserMethodArgumentResolver);
}
}
- 控制层可以通过@CurrentUser注解来实现当前登录用户信息自动解析注入
@RequestMapping("/list")
public ResultInfo<?> list(@CurrentUser SysUser sysUser,String name){
// sysUser 就是当前登录用户的信息
}