HandlerMethodArgumentResolver 接口详情
public interface HandlerMethodArgumentResolver {boolean supportsParameter(MethodParameter parameter);@NullableObject 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)@Documentedpublic @interface CurrentUser {}
自定义参数解析,若参数中有我们自定义@CurrentUser注解时,将当前登录用户信息保存至其中
@Componetnpublic class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {@Resourceprivate 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容器中
@Configurationpublic class ApplicationConfigurer extends WebMvcConfigurerAdapter {@Resourceprivate CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {super.addArgumentResolvers(argumentResolvers);argumentResolvers.add(currentUserMethodArgumentResolver);}}
控制层可以通过@CurrentUser注解来实现当前登录用户信息自动解析注入
@RequestMapping("/list")public ResultInfo<?> list(@CurrentUser SysUser sysUser,String name){// sysUser 就是当前登录用户的信息 }