后端的许多管理系统需要登陆者的信息,如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一致。
以上这篇在springboot中使用注解将值注入参数的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
imi 中有一类注解,他们支持将值动态注入到注解属性中,当调用获取注解属性时,才实时计算并返回。 注解说明 @ConstValue 从常量中读取值 属性名称 说明 name 常量名 default 常量不存在时,返回的默认值 @ConfigValue 从配置中读取值 属性名称 说明 name 配置名,支持@app、@currentServer等用法 default 配置名,支持@app、@curr
问题内容: 我有一堆Spring bean,它们是通过注释从类路径中拾取的,例如 我想将app.properites的属性之一注入到上面显示的bean中。我不能简单地做这样的事情 因为PersonDaoImpl在Spring XML文件中没有功能(它是通过注释从类路径中拾取的)。我有以下内容: 但是我不清楚我如何从中访问我感兴趣的财产? 问题答案: 你可以在Spring 3中使用EL支持进行此操作
问题内容: 我有一堆Spring bean,它们是通过注释从类路径中拾取的,例如 在Spring XML文件中,定义了一个PropertyPlaceholderConfigurer: 我想将app.properites的属性之一注入到上面显示的bean中。我不能简单地做这样的事情 因为PersonDaoImpl在Spring XML文件中没有功能(它是通过注释从类路径中拾取的)。我有以下内容: 但
我有一个控制器 服务接口 我想在我的控制器中使用@autowired来使用该服务,但当我运行应用程序时,我得到以下错误 org.springframework.beans.factory.beanCreationException:创建名为“demo application”的bean时出错:注入autowired依赖项失败;嵌套异常为org.SpringFramework.Beans.Facto
问题内容: 我的spring bean具有一个带有唯一强制性参数的构造函数,我设法用xml配置对其进行了初始化: 然后,我像这样使用此bean,并且效果很好。 但是我想用注释指定contructor arg值,例如 这可能吗 ? 提前致谢 问题答案: 首先,必须在bean定义中而不是在注入点中指定构造函数arg。然后,你可以利用spring的注释(spring 3.0) 就我所看到的问题而言,这可
下面是如何配置应用程序的 问题是在应用程序启动期间,我得到以下错误 并且有很长的堆栈错误堆栈和描述 null 我刚试过用两个自定义方法param注入,那也不起作用