概述
最近在写一个使用阿里云OSS服务为基础的网盘项目,本质上就是给每一个用户分配一个「文件夹」.
当用户操作自己的文件的时候以自己的用户ID为开头去操作,在业务之中用户ID存放在 token 中,而 token 存放在 Header中.. 在之前的编写里,每次写这样悠长的无意义代码。
所以这个时候想起了之前所学的自定义注解,心想能不能通过结合注解和拦截器去注入这个呢。 最后得到解决办法实现 HandlerMethodArgumentResolver 接口,创建一个参数解析器~
开始
定义注解
为了区分注入在哪里,肯定是需要注入一个注解,并且注解的目标范围在 Parameter(参数)。
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserId {
}
实现解析器接口
首先实现接口中的两个方法 。
- supportsParameter 作用在那些注解之上。
- resolveArgument 注入参数。相关代码在这里编写,return 就是要注入的目标值。
public class InfoResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(UserId.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
return JwtUtil.getPayload(webRequest.getHeader("token")).get("userId").toString();
}
}
在配置类中启动「实现 WebMvcConfigurer 的类」
首先注册编写一个方法。
@Bean
public InfoResolver infoResolver(){
return new InfoResolver();
}
然后实现 addArgumentResolvers 方法将上面那个方法加载进去即可。
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(infoResolver());
}
本页的评论功能已关闭