什么时注解参数

说明 我们在 使用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){

}

 

posted on 2020-05-07 10:32  自由港  阅读(9251)  评论(0编辑  收藏  举报