栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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是我手动构建的登录态,很多参数是空的不用管

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691765.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号