使用 Spring MVC 参数解析器自动注入参数

概述

最近在写一个使用阿里云OSS服务为基础的网盘项目,本质上就是给每一个用户分配一个「文件夹」.

当用户操作自己的文件的时候以自己的用户ID为开头去操作,在业务之中用户ID存放在 token 中,而 token 存放在 Header中.. 在之前的编写里,每次写这样悠长的无意义代码。
Snipaste_2020-06-28_19-34-15.png

所以这个时候想起了之前所学的自定义注解,心想能不能通过结合注解和拦截器去注入这个呢。 最后得到解决办法实现 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());
    }