• springboot 参数注解 注入参数


    什么时注解参数

    说明 我们在 使用spring mvc 的时候会使用这样的注解 @ResponseBody 这样,spring mvc 会将 客户端传来的数据,自动构建成 相应类型的对象。

    有些情况下我们 获取当前登录人 ,我们也可以使用注解参数。

    实现代码

    比如 我们写这样的一个方法:

    public void getUser(@LoginUser User user){

    }

    添加一个注解类

    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface LoginUser {
        /**
         * 是否查询SysUser对象所有信息,true则通过rpc接口查询
         */
        boolean isFull() default false;
    }

    增加一个参数解析类

    public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
    
    
        private RemoteUserService userService;
    
        public TokenArgumentResolver(RemoteUserService userService) {
            this.userService = userService;
        }
    
        /**
         * 入参筛选
         *
         * @param methodParameter 参数集合
         * @return 格式化后的参数
         */
        @Override
        public boolean supportsParameter(MethodParameter methodParameter) {
            return methodParameter.hasParameterAnnotation(LoginUser.class) &&
                    methodParameter.getParameterType().equals(JPaasUser.class);
        }
    
        /**
         * @param methodParameter       入参集合
         * @param modelAndViewContainer model 和 view
         * @param nativeWebRequest      web相关
         * @param webDataBinderFactory  入参解析
         * @return 包装对象
         */
        @Override
        public Object resolveArgument(MethodParameter methodParameter,
                                      ModelAndViewContainer modelAndViewContainer,
                                      NativeWebRequest nativeWebRequest,
                                      WebDataBinderFactory webDataBinderFactory) {
            LoginUser loginUser = methodParameter.getParameterAnnotation(LoginUser.class);
            boolean isFull = loginUser.isFull();
            HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
            String userId = request.getHeader(SecurityConstants.USER_ID_HEADER);
            String username = request.getHeader(SecurityConstants.USER_HEADER);
            String roles = request.getHeader(SecurityConstants.ROLE_HEADER);
            if (StrUtil.isBlank(username)) {
                log.warn("resolveArgument error username is empty");
                return null;
            }
            User user;
            if (isFull) {
                user = userService.selectByUsername(username);
            } else {
                user = new User();
                user.setUserId(userId);
                user.setAccount(username);
            }
    
            return user;
        }
    }

    这个代码会从请求上下文获取数据并构建上下文用户对象。

    在 mvc 配置中增加这个参数解析类。

    public class DefaultWebMvcConfig extends WebMvcConfigurationSupport {
        @Lazy
        @Autowired
        private RemoteUserService userService;
    
        /**
         * Token参数解析
         *
         * @param argumentResolvers 解析类
         */
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            //注入用户信息
            argumentResolvers.add(new TokenArgumentResolver(userService));
            //注入应用信息
            argumentResolvers.add(new ClientArgumentResolver());
        }

    这样就可以就可以在参数中直接使用以下代码获取上下文用户了。

    public void getUser(@LoginUser User user){

    }

  • 相关阅读:
    登录界面点击登录后如何延迟提示成功的div的显示时间并跳转
    关于如何用jq定位到某个元素的索引
    总结React关于require的问题
    关于React的赋值与调用方法
    React项目搭建(脚手架)
    关于th,td,tr的一些相关标签
    一个IP多个https站点配置
    ubuntu配置apache的虚拟主机
    putty如何使用
    CI基本配置
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/12841300.html
Copyright © 2020-2023  润新知