是否可以在使用new关键字创建的类中获取CDI的实例?我们目前正在对一个旧的应用程序进行一些增强,每次在应用程序中对CDI进行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;
}
}发布于 2015-04-09 09:50:01
有两种可能的解决方案。
CDI.current().get(MySingletonClass.class);。您还需要注意,不仅容器被引导,而且上下文也被正确激活。这通常是通过ServletListener完成的。如果你在一个EE容器中,那么他们会为你注册它。如果你使用的是普通的猫,码头等,那么你需要自己激活它。
请参阅Apache OpenWebBeans中的OpenWebBeans。
https://stackoverflow.com/questions/28600457
复制相似问题