You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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的方法时,才会触发数据库查询,避免了不必要的性能开销。

额外检查点(确保万无一失)

  1. 确认UserProvider的@RequestScoped注解没问题:这个Scope保证了每个请求都会重新获取当前用户的JWT声明并查询数据库,符合请求级别的上下文需求。
  2. 确认@Claim("upn")能正常获取到JWT中的声明:在RequestScoped的Bean中,SmallRye JWT的@Claim注解是可以正常工作的,能正确提取当前请求的JWT信息。

备注:内容来源于stack exchange,提问作者aslary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:19:52