是否有可能以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
是实体并且它们不支持注入)。
我已经尝试通过以下静态方法获得的
注入: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
。