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

标签 java dependency-injection jersey hk2

我想使用 HK2 DI 根据登录 Jersey API 的用户自动注入(inject)类的新实例。

用户使用 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) {
    }
}

绑定(bind)是这样的:

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

和实现:

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

但是这个工厂在我的应用程序的生命周期中调用得太早,并且 SecurityContext 仍然为空。

据我了解,在运行时执行的解决方案是将工厂绑定(bind)为代理,如下所示:

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

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

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

如果有人有想法,我已经尝试了很多东西,但我完全不走运

最佳答案

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

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

因此,在这个过滤器中,我只是读取了我的 token ,它可以在需要注入(inject)用户帐户的 UserDaoFactory 中使用。

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

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

关于java - 具有构造函数的类的依赖注入(inject)需要有关登录 SecurityContext 的用户的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58634903/

相关文章:

symfony - Symfony2 中的依赖注入(inject)最佳实践

java - 使用 guice,如何配置 Jersey 的媒体类型映射?

java - 如何在 POST 期间获取不同资源的 JAX-RS @Path?

java - 如何用java从数据中删除 header

java - ResultSet.TYPE_SCROLL_SENSITIVE 的行为

java - ArrayList 元素替换为新条目

scala - 如何使用 Play 2.4 将服务注入(inject)到 Actor 中?

java - 递归查找数组中数字的最小路径

java - 使用 exec-maven-plugin 执行 war 文件

java - 运行具有 Spring 依赖项的 Maven 项目时出现 ClassNotFoundException