zoukankan      html  css  js  c++  java
  • 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){

    }

  • 相关阅读:
    安全攻防技能——安全基础概念
    解决linux下中文文件名显示乱码问题
    yaml封装
    IIS挂载网站一键更新备份
    MySQL 聚集索引和二级索引
    redolog落盘机制
    MySQL中Redo Log相关的重要参数总结
    mysql之innodb_buffer_pool
    xshell ssh 登录慢
    记录pg
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/12841300.html
Copyright © 2011-2022 走看看