是否有可能获得 CDI conversation
以编程方式实例只知道当前的 thread
是用来处理 CDI request
的与想要的对话相关联?如果可能的话怎么办?
特别是,我想做的是:
@ConversationScoped
public class UnitOfWork {...}
public class Client {
@Inject transient UnitOfWork uof;
...
}
public class Room {
@Inject transient UnitOfWork uof;
...
}
但使用编程机制来初始化
uof
实例变量而不是应用 @Inject 注释(因为 Client
和 Room
是实体,它们不支持注入(inject))。我已经尝试注入(inject)
UnitOfWork
通过 BeanManager
通过以下静态方法获得:public static <B> B getManagedBean(Class<B> type, Annotation... qualifiers) {
try {
BeanManager beanManager = InitialContext.doLookup("java:comp/BeanManager");
Set<Bean<?>> beans = beanManager.getBeans(type, qualifiers);
Bean<B> bean = (Bean<B>) beanManager.resolve(beans);
CreationalContext<B> cc = beanManager.createCreationalContext(bean);
return bean.create(cc);
} catch (NamingException e) {
throw new RuntimeException("", e);
}
}
但问题是通过上述方法给出的bean是新的(每次调用都会给出一个新实例),我需要
Client
和 Room
共享 UnitOfWork
的同一个 session 范围实例.
最佳答案
抱歉,这不是一个真正的答案,但在评论中写得太多了:
有原因实体不支持依赖注入(inject) - 主要是因为它们的生命周期与托管 bean 的生命周期是分离的。
虽然我当然在实体中看到了 DI 的用例,但我会加倍(和三倍)检查这种方法的好处是否超过风险。您可能会发现自己在某种二级缓存 hell 中破解持久性上下文;)
关于jakarta-ee - 程序化对话查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12257006/