是否可以在使用创建的类中获取 CDI bean 的实例new
关键词?我们目前正在对旧应用程序进行一些增强,并且我们总是会得到上下文不活跃异常 http://docs.jboss.org/cdi/api/1.0/javax/enterprise/context/ContextNotActiveException.html每次我们做一个程序化的 http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/在我们的应用程序中查找 CDI Singleton beans。
获取参考代码:
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;
}
}
有两种可能的解决方案。
如果您有 JavaEE-7 容器,那么您可以使用CDI.current().get(MySingletonClass.class);
如果您有 JavaEE-6 容器甚至 Java SE 应用程序,那么您可以使用Apache DeltaSpike BeanProvider http://deltaspike.apache.org/documentation/core.html#_beanprovider。
它尝试从 JNDI 查找 BeanManager,但也执行其他技巧,如果您没有完整的 EE 容器,这些技巧也可以工作。例如。在SE和单元测试中。
您还需要注意不仅容器已启动,而且上下文也已正确激活。这通常是通过 ServletListener 完成的。如果您位于 EE 容器中,那么他们会为您注册。如果您使用的是普通的 tomcat、jetty 等,那么您需要自己激活它。
See 这个例子 https://github.com/apache/openwebbeans/blob/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java来自 Apache OpenWebBeans。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)