【发布时间】:2012-08-28 17:32:18
【问题描述】:
是否有可能仅知道当前的thread 是用于处理与所需对话关联的CDI request 的CDI conversation 实例?如果可能,那怎么做?
具体来说,我想做的是这样的:
@ConversationScoped
public class UnitOfWork {...}
public class Client {
@Inject transient UnitOfWork uof;
...
}
public class Room {
@Inject transient UnitOfWork uof;
...
}
但是使用编程机制来初始化uof 实例变量而不是应用@Inject 注释(因为Client 和Room 是实体并且它们不支持注入)。
我已经尝试通过以下静态方法获得的BeanManager 注入UnitOfWork:
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。
【问题讨论】:
标签: jakarta-ee cdi lookup conversation-scope