你的浏览器不支持canvas

做你害怕做的事情,然后你会发现,不过如此。

Spring Boot使用HandlerMethodArgumentResolver解析请求参数

时间: 作者: 黄运鑫

本文章属原创文章,未经作者许可,禁止转载,复制,下载,以及用作商业用途。原作者保留所有解释权。


HandlerMethodArgumentResolver的方法

  • HandlerMethodArgumentResolver有两个方法,supportsParameterresolveArgument
  • supportsParameter方法返回布尔值,用来判断是否执行resolveArgument方法,如果返回false则不执行。
  • resolveArgument方法返回ObjectObject就是解析参数最终得到的对象。

什么时候使用HandlerMethodArgumentResolver

  • 当多个接口需要频繁处理请求中的参数时,可以使用HandlerMethodArgumentResolver统一处理。比如根据请求头中的token获取当前用户;或是需要将请求参数中的时间格式转换为时间戳。

实例

通过header中的token获取当前用户信息

  • 创建自定义注解

      /**
       * 自定义注解,通过注解获取当前用户
       */
      @Target({ElementType.PARAMETER})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface UserInfo {
        
      }
    
  • 创建参数解析器

      /**
       * 通过请求头中的token获取用户信息的解析器
       */
      public class UserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {
        
          public UserInfoMethodArgumentResolver() {
          }
        
          @Override
          public boolean supportsParameter(MethodParameter parameter) {
              //如果有UserInfo注解,则执行resolveArgument
              if (parameter.hasParameterAnnotation(UserInfo.class)) {
                  return true;
              }
              return false;
          }
        
          @Override
          public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
              //获取用户登录凭证
              String token = webRequest.getHeader("access-token");
              //获取用户信息
              SysUser sysUser = TokenUtils.getUserInfoByToken(token);
              return sysUser;
          }
      }
    
  • 添加自定义参数解析器

      @Configuration
      @AutoConfigureAfter
      public class MvcAdvanceConfig extends WebMvcConfigurationSupport {
        
          @Override
          public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
              //添加自定义参数解析器
              argumentResolvers.add(new UserInfoMethodArgumentResolver());
              super.addArgumentResolvers(argumentResolvers);
          }
      }
    
  • 测试controller

      @RestController
      @RequestMapping(value = "/api/test")
      public class TestController {
        
          @GetMapping
          public String query(@UserInfo SysUser sysUser, @ApiDataParam("data") RequestApiData reqApiData) {
              System.out.println(sysUser.getUserName());
              return "测试";
          }
      }
    

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。