【发布时间】:2015-04-20 10:45:39
【问题描述】:
是否可以在使用new 关键字创建的类中获取 CDI bean 的实例?我们目前正在对旧应用程序进行一些增强,每次在我们的应用程序中对 CDI 单例 bean 进行 programmatic 查找时,我们总是会得到 ContextNotActiveException。
获取参考代码:
public class ClassCreatedWithNew{
public void doSomething(){
MySingletonBean myBean = BeanManagerSupport.getInstance().getBean(MySingletonBean.class);
}
}
BeanManagerSupport.java
public class BeanManagerSupport {
private static final Logger LOG = Logger.getLogger(BeanManagerSupport.class);
private static final BeanManagerSupport beanManagerSupport = new BeanManagerSupport();
private BeanManager beanManager;
private BeanManagerSupport() {
try {
beanManager = InitialContext.doLookup("java:comp/BeanManager");
} catch (NamingException e) {
LOG.error("An error has occured while obtaining an instance of BeanManager", e);
}
}
@SuppressWarnings("unchecked")
public <T> T getBean(Class<T> clazz) {
Iterator<Bean< ? >> iter = beanManager.getBeans(clazz).iterator();
if (!iter.hasNext()) {
throw new IllegalStateException("CDI BeanManager cannot find an instance of requested type " + clazz.getName());
}
Bean<T> bean = (Bean<T>) iter.next();
return (T) beanManager.getContext(bean.getScope()).get(bean);
}
public static BeanManagerSupport getInstance(){
return beanManagerSupport;
}
}
【问题讨论】:
-
你想用 new! 创建一个单调 CDI bean 的实例吗?
-
@FarhangAmary'Ferhęg' - 不,事实并非如此。请参阅我发布的代码以使其更清晰
-
你试过
CDI.current().get(MySingletonClass.class)吗?
标签: java cdi java-ee-6 openwebbeans