java自定义接口方法的参数自动注入,比如@UserId Long userId、@LoginedUser User user

这样的如何实现?自动注入当前登录的用户id、当前登录的用户对象

	@RequestMapping("/test1")
    public String test1(@UserId Long userId, @LoginedUser User user) {
        return String.format("test1,userId=%s , User对象: %s", userId, user);
    }

第一步-解析用户请求Header里的token

通过token进一步拿到用户的相关信息,并将信息设置到request的attributes
由于解析过程大家各自实现不同,这里不贴完整代码了,设置上去的key你自己定

//解析token进一步拿到用户信息,假设是user
//设置到request attribute里
request.setAttribute(IUserAuthUtil.LOGINED_USER, user);

第二步-定义自己的注解(按需来,也可以不定义)

**
 * 注入登录的用户ID
 *
 * @author : humorchen
 * @date 2022/1/1
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface UserId {
}

**
 * 注入登录的用户对象
 *
 * @author : humorchen
 * @date 2022/1/1
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface LoginedUser {
}

第三步-自定义接口方法参数注入


/**
 * 参数注入@UserId
 *
 * @author :humorchen
 * @date 2022/1/2 16:48
 */
@Component
@Slf4j
public class UserIdArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        Parameter reflectParameter = parameter.getParameter();
        return reflectParameter.isAnnotationPresent(UserId.class) && reflectParameter.getType().equals(Long.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        User user = (User) webRequest.getAttribute(IUserAuthUtil.LOGINED_USER, NativeWebRequest.SCOPE_REQUEST);
        //从request拿到的
        if (user != null) {
            return user.getId();
        }
        return null;
    }
}


/**
 * 注解注入已登录用户@LoginedUser
 *
 * @author :humorchen
 * @date 2022/1/2 17:05
 */
@Component
public class LoginedUserArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        Parameter reflectParameter = parameter.getParameter();
        return reflectParameter.isAnnotationPresent(LoginedUser.class) && reflectParameter.getType().equals(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        return webRequest.getAttribute(IUserAuthUtil.LOGINED_USER, NativeWebRequest.SCOPE_REQUEST);
    }
}

第四步-注册上去


/**
 * spring mvc web 配置
 *
 * @author :humorchen
 * @date 2022/1/1 22:14
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
    @Autowired
    private UserIdArgumentResolver userIdArgumentResolver;
    @Autowired
    private LoginedUserArgumentResolver loginedUserArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        //@UserId注入
        resolvers.add(userIdArgumentResolver);
        //@LoginedUser注入
        resolvers.add(loginedUserArgumentResolver);
    }

    
}

测试结果

在这里插入图片描述
能够正常拿到

这里的User是我手动构建的登录态,很多参数是空的不用管
在这里插入图片描述

posted @ 2022-01-02 19:16  HumorChen99  阅读(4)  评论(0编辑  收藏  举报  来源