自定义参数解析器(HandlerMethodArgumentResolver) 实现用户token解析
在项目中获取用户信息 会被频繁用到,那么怎么可以快速简洁的实现获取当前请求用户信息呢?
可以通过自定义注解实现,详情如下:
1.自定义注解:@Target({ElementType.PARAMETER}) 表明该注解作用于参数上。
@Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface CurrentUser { boolean required() default false; }
2. 自定义解析器实现HandlerMethodArgumentResolver接口,包含两个接口
supportsParameter:用于判定是否需要处理该参数解析,返回true为需要,并会去调用下面的方法resolveArgument。
resolveArgument:用于处理参数分解的方法,返回的Object就是controller方法上的形参对象
public interface HandlerMethodArgumentResolver { boolean supportsParameter(MethodParameter parameter); @Nullable Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception; }
@Component @Slf4j public class UserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private UserFeignApiService userFeignApiService; @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(CurrentUser.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String token = webRequest.getHeader("token"); if (parameter.getParameterAnnotation(CurrentUser.class).required()) { if (StringUtils.isBlank(token)) { throw new IllegalArgumentException("token不能为空"); } return userFeignApiService.getByToken(token); } if (StringUtils.isNotBlank(token)) { return userFeignApiService.getByToken(token); } return null; } }
3. 自定义方法解析 加入WeMvcConfigurer
@Configuration public class MvcConfig implements WebMvcConfigurer { @Autowired private UserMethodArgumentResolver userMethodArgumentResolver; @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(userMethodArgumentResolver); WebMvcConfigurer.super.addArgumentResolvers(resolvers); } }
至此 ,我们就可以在接口参数上通过@CurrentUser 获取用户信息了。