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

问题描述 投票:0回答:1

我想使用HK2 DI来自动注入类的新实例,具体取决于登录我的Jersey API的用户。

用户使用AuthenticationFilter类登录,我可以在所有端点中将其导入@Context SecurityContext。

我有一个DAO类,需要有关用户的信息。这只是我应该在数据库上执行查询的架构。

所以我的Dao的构造函数是这样的:

public UserDao(String schemaCompte) {
    super(schemaCompte);
}

[似乎解决方案是使用Factory实例化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)

和实现:

@Inject
public UserSvc(UserDao userDao) {
    ...
}

但是该工厂在我的应用程序的生命周期中被调用为时过早,并且SecurityContext仍然为空。

据我所知,要在运行时执行的解决方案是将Factory绑定为这样的代理:

bindFactory(UserDaoFactory.class).proxy(true).to(UserDao.class)

但是当我这样做时,我得到了运行时异常:

java.lang.RuntimeException: java.lang.InstantiationException: com.metier.user.UserDao_$$_jvst5c_0

[如果有人有一个主意,我已经尝试了很多事情,但我完全不走运

java dependency-injection jersey hk2
1个回答
0
投票

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

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

因此,在此过滤器中,我只读取了令牌,并且该令牌在需要注入用户帐户的UserDaoFactory中可用。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.