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

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

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 {
}

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

@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;
    }
}


@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);
    }
}
第四步-注册上去

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
    @Autowired
    private UserIdArgumentResolver userIdArgumentResolver;
    @Autowired
    private LoginedUserArgumentResolver loginedUserArgumentResolver;

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

    
}
测试结果


能够正常拿到

这里的User是我手动构建的登录态,很多参数是空的不用管

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5692250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存