为了账号安全,请及时绑定邮箱和手机立即绑定

具有构造函数的类的依赖注入需要有关登录 SecurityContext 的用户的信息

具有构造函数的类的依赖注入需要有关登录 SecurityContext 的用户的信息

倚天杖 2024-01-17 17:06:34
我想使用 HK2 DI 根据登录 Jersey API 的用户自动注入类的新实例。用户使用 AuthenticationFilter 类进行登录,我可以在所有端点中将其放入 @Context SecurityContext 中。问题是我有一个 DAO 类,需要实例化有关用户的信息。这只是我应该在数据库上执行查询的架构。所以我的Dao的构造函数是这样的:public UserDao(String schemaCompte) {    super(schemaCompte);}解决方案似乎是使用工厂通过 HK2 实例化我的 Dao,所以我尝试创建一个这样的:public class UserDaoFactory implements Factory<UserDao> {    @Context SecurityContext securityContext;    @Override    public UserDao provide() {        User userPrincipal = (User) securityContext.getUserPrincipal();        return new UserDao(userPrincipal.getCode());    }    @Override    public void dispose(UserDao userDao) {    }}绑定是这样的:bindFactory(UserDaoFactory.class).to(UserDao.class)和实施:@Injectpublic UserSvc(UserDao userDao) {    ...}但是这个工厂在我的应用程序的生命周期中被调用得太早,并且 SecurityContext 仍然是空的。据我了解,在运行时执行的解决方案是将工厂绑定为代理,如下所示:bindFactory(UserDaoFactory.class).proxy(true).to(UserDao.class)但是当我这样做时,我得到一个运行时异常:java.lang.RuntimeException: java.lang.InstantiationException: com.metier.user.UserDao_$$_jvst5c_0如果有人有想法,我已经尝试了很多事情,但我完全不走运
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

所以,事实证明我缺少的是@PreMatching我在 Jersey Api 中注册的提供程序中的注释。

此注释告诉 Jersey 在执行其他所有操作之前执行此过滤器,甚至与调用的端点进行匹配。

因此,在这个过滤器中,我只是读取了我的令牌,它可以在UserDaoFactory需要注入用户帐户的地方使用。

我制作了一个小型 github 存储库来解释我的观点: https: //github.com/m4nu56/jersey-hk2以及一篇 Medium 文章:https://medium.com/@mnu/jersey-injection-dependency-example-with -hk2-84ebfb7cb2d2

最后我没有使用工厂,因为我没有意识到我可以直接在我的 Dao 构造函数中注入用户或帐户。


查看完整回答
反对 回复 2024-01-17
  • 1 回答
  • 0 关注
  • 38 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信