暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

springMvc参数解析器,让你的方法入参更优雅

IT学习道场 2022-11-17
186

spring参数解析器,让你的方法入参更优雅

曾几何时,我们编程从原始时代进入石器时代,开始拥有使用工具的思想,于是大量的工具,util和脚手架开始像雨后春笋似的出现,spring字如其名,像春天一样,奠定了万物复苏的基石,于是基于spring的大量框架开始出现,如springMvc,springboot,springcloud等,生态一时无两。作为使用spring多年的老用户,总是会好奇我们在使用开发的各种功能,于是像猫一样的探索,挖掘,模仿让人着谜的各种设计。今天分享参数解析器,实现像@RequestBody一样的功能,一个注解自动注入想要参数的方法解析器实战。废话不多说,直接上代码!

功能背景描述:

    在开发中,经常会用到在控制层的对外请求接口入参中,希望通过一个注解来注入当前登录用户信息,从而在接口功能下行过程中,能够一直传下去,来实现用户信息的获取

实现步骤如下:

定义当前登录用户类 CurrentUser

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;


    /**
    * 描述:当前登录用户 </br>
    * 作者:IT学习道场 </br>
    * 时间:2022-11-15 19:07
    */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class CurrentUser {
    private Long userId;
    private String userName;
    }


    复制

    自定义注解

      import java.lang.annotation.*;


      /**
      * 描述:自定义用户注解 </br>
       * 作者:IT学习道场 </br>
      * 时间:2022-11-15 16:56
      */
      @Target(ElementType.PARAMETER)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface WlcUser {
      }
      复制

      当前用户解析器
      复制
        import com.example.demo.annotation.WlcUser;
        import com.example.demo.po.CurrentUser;
        import org.springframework.core.MethodParameter;
        import org.springframework.web.bind.support.WebDataBinderFactory;
        import org.springframework.web.context.request.NativeWebRequest;
        import org.springframework.web.method.support.HandlerMethodArgumentResolver;
        import org.springframework.web.method.support.ModelAndViewContainer;


        /**
        * 描述:当前用户解析器 </br>
        * 作者:IT学习道场 </br>
        * 时间:2022-11-15 17:01
        */
        public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {


        @Override
        public boolean supportsParameter(MethodParameter parameter) {
        //方法参数是否带有 WlcUser注解,带的话就解析执行下方 resolveArgument 方法
        return parameter.hasParameterAnnotation(WlcUser.class);
        }


        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        //1 这里面可以从httpHeader中获取用户标识或者其他属性值,也可以通过springIoc中bean来执行增删改查,rpc来获取,但是要用spring的上下文来获取bean
        //2 也可以从token中解析出当前登录用户信息,返回也行对象 CurrentUser
        //3 也可以从你自己定义的用户上下文中获取 CurrentUser,前提你要自己写一个用户上下文
        //4 这里调用sprinIoc里管理的bean的话,需要 SpringContextUtil上下文来获取bean,在调用方法
        //5 这里只是自己new了一个当前用户,来直接赋予加了 WlcUser 注解修饰的对象
        CurrentUser currentUser = new CurrentUser(1L,"老王");
        return currentUser;
        }
        }
        复制

        把参数解析器注入到mvc中

          import com.example.demo.resolver.CurrentUserMethodArgumentResolver;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.web.method.support.HandlerMethodArgumentResolver;
          import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
          import java.util.List;


          /**
          * 描述:web拦截器,解析器配置类 </br>
          * 作者:IT学习道场 </br>
          * 时间:2022-11-15 19:09
          */
          @Configuration
          public class WebConfig implements WebMvcConfigurer {
          @Override
          public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
          resolvers.add(new CurrentUserMethodArgumentResolver());
          }
          }
          复制

          现在测试controller测试实现

            import com.example.demo.annotation.WlcUser;
            import com.example.demo.po.CurrentUser;
            import lombok.extern.slf4j.Slf4j;
            import org.springframework.web.bind.annotation.GetMapping;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.bind.annotation.RestController;


            /**
            * 描述:参数解析解TestController </br>
            * 作者:IT学习道场 </br>
            * 时间:2022-11-16 9:25
            */
            @Slf4j
            @RestController
            @RequestMapping("/currentUserResolver")
            public class CurrentUserResolverController {


            @GetMapping("/currentUserResolve")
            public void currentUserResolve(@WlcUser CurrentUser user){
            log.info("参数解析器注入 CurrentUser = {}", user.toString());
            }
            }
            复制

            请求下,控制台日志

            参数解析自动注入成功!自己动手丰衣足食,去玩玩吧!

            文章转载自IT学习道场,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论