如何让Quarkus中自定义的@CurrentUser注解同时支持类属性与方法参数注入?
如何让Quarkus中自定义的@CurrentUser注解同时支持类属性与方法参数注入?
嗨,我来帮你搞定这个问题!
你遇到的情况其实是CDI规范的标准行为导致的:Quarkus(以及其他CDI容器)会自动处理构造函数的参数注入,但普通方法的参数需要显式标注@Inject才能触发注入逻辑。你的@CurrentUser限定符在构造函数注入时生效,是因为Quarkus默认会解析构造函数的依赖并自动注入,但普通方法的参数不会默认触发这个流程。
最简单的解决方案:给方法参数添加@Inject
只需要修改你的Use Case 2代码,在@CurrentUser前面加上@Inject注解,就能让Producer的currentUser()方法被正常调用:
@Path("auditions") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @PermitAll class AuditionResource { @PATCH fun foo( @Inject @CurrentUser currentUser: User? ) { println("HI") } }
为什么这样能行?
- 对于类的构造函数参数(Use Case1的场景):Quarkus会自动识别构造函数的依赖,不需要额外加
@Inject就能触发CDI注入流程,所以你的@CurrentUser能正常工作。 - 对于普通方法的参数:CDI容器不会自动扫描注入,必须显式添加
@Inject,告诉容器这个参数需要从CDI上下文获取实例,再配合你的@CurrentUser限定符,就能定位到UserProvider里的Producer方法,完成用户实例的加载。
这样修改后,两种场景都能正常工作,而且完全符合你想要的“按需加载”需求——只有当调用需要currentUser的方法时,才会触发数据库查询,避免了不必要的性能开销。
额外检查点(确保万无一失)
- 确认
UserProvider的@RequestScoped注解没问题:这个Scope保证了每个请求都会重新获取当前用户的JWT声明并查询数据库,符合请求级别的上下文需求。 - 确认
@Claim("upn")能正常获取到JWT中的声明:在RequestScoped的Bean中,SmallRye JWT的@Claim注解是可以正常工作的,能正确提取当前请求的JWT信息。
备注:内容来源于stack exchange,提问作者aslary
相关产品推荐
相关产品推荐

