java - 具有构造函数的类的依赖注入,需要有关登录 SecurityContext 的用户的信息
问题描述
我想使用 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)
和实施:
@Inject
public UserSvc(UserDao userDao) {
...
}
但是在我的应用程序的生命周期中调用这个工厂太快了,SecurityContext 仍然是空的。
因此,据我了解,在运行时执行的解决方案是将工厂绑定为这样的代理:
bindFactory(UserDaoFactory.class).proxy(true).to(UserDao.class)
但是当我这样做时,我得到一个运行时异常:
java.lang.RuntimeException: java.lang.InstantiationException: com.metier.user.UserDao_$$_jvst5c_0
如果有人知道我已经尝试了很多东西,我完全不走运
解决方案
因此,事实证明我缺少的是@PreMatching
我在 Jersey Api 中注册的提供程序中的注释。
此注释告诉 Jersey 在执行其他所有操作之前执行此过滤器,甚至与被调用的端点匹配。
所以在这个过滤器中,我只是阅读了我的令牌,它可以在UserDaoFactory
需要注入用户帐户的地方使用。
我做了一个小的 github repo 来解释我的观点:https ://github.com/m4nu56/jersey-hk2以及一篇 Medium 文章:https ://medium.com/@mnu/jersey-injection-dependency-example-with -hk2-84ebfb7cb2d2
最后我没有使用Factory,因为我没有意识到我可以直接在我的Dao的构造函数中注入用户或帐户。
推荐阅读
- python - 使用来自另一个数据帧的条件填充和生成熊猫数据帧
- system - 可寻址性/地址空间之间的关系
- protocols - 试图解码 RS485 协议
- python - 尝试将函数应用于数据框返回“方法”对象不可下标
- python - 如何在 Python 的前两个打印行之间添加一行破折号?
- javascript - 通过 rest API 以 0 或 null 形式出现的值反应本机/弹簧启动
- javascript - 使用 jquery 改进 json 解码
- html - 使用本地文件为 UIWebView 确定“根目录”
- r - Azure Functions 中缺少 R 站点扩展
- sass - Bootstrap 4 内联网格或 Sass 混合和性能