springboot中使用注解将值注入参数

springboot中使用注解将值注入参数

       后端的许多管理系统需要登陆者的信息,如shiro登陆后,会将登陆者的信息存储在shiro的session,在使用时需要多行代码获取用户信息。可以把获取在shiro中的登陆者信息封装在一个类中,使用时获取。本文主要讲述如何使用注解将值注入参数,shiro的配置请自行百度。

定义注解
新建一个InfoAnnotation.java的注解类,用于注解参数,代码如下:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface InfoAnnotation {
    String value() default "userId";//默认获取userId的值
}
定义注解处理类
新建一个InfoResolver类,AOP无法将值注入参数,需要继承HandlerMethodArgumentResolver类,代码如下:
public class InfoResolver implements HandlerMethodArgumentResolver {
    //使用自定义的注解
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(InfoAnnotation.class);
    }

    //将值注入参数
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        //获取捕获到的注解
        InfoAnnotation annotation = methodParameter.getParameterAnnotation(InfoAnnotation.class);
        String value = annotation.value();
        //获取需要注入值得逻辑
        //该例子在shiro中获取userId或者用户信息
        if (value == null || "".equalsIgnoreCase(value) || value.equalsIgnoreCase("userId")){
            User user = (User)SecurityUtils.getSubject().getSession().getAttribute("user");
            if (user == null){
                return 1;
            }
            return user.getId();
        } else if ("user".equalsIgnoreCase(value)){
            return SecurityUtils.getSubject().getSession().getAttribute("user");
        }
        return value;
    }
}
使springboot支持该拦截器
修改启动类,继承WebMvcConfigurationSupport类,添加自定义得拦截器,代码如下:
@SpringBootApplication
public class DemoApplication extends WebMvcConfigurationSupport {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    //添加自定义的拦截器
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){
        super.addArgumentResolvers(argumentResolvers);
        argumentResolvers.add(new InfoResolver());
    }
}
测试

测试用例,如下代码

@GetMapping
public BaseResponse<?> test(@InfoAnnotation int userId){
    return ResponseUtil.successResponse(userId);
}

登陆返回的信息
登陆返回的信息


调用测试用例返回的信息
调用测试用例返回的信息

可以看到登陆返回的用户信息的id和测试用例返回的data一致。
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值