gpt4 book ai didi

java - 在非托管 CDI Bean 中引用 CDI Bean

转载 作者:行者123 更新时间:2023-11-30 11:08:19 29 4
gpt4 key购买 nike

是否可以在使用 new 关键字创建的类中获取 CDI bean 的实例?我们目前正在对一个旧应用程序进行一些改进,我们总是得到一个 ContextNotActiveException每次我们做 programmatic在我们的应用程序中查找 CDI Singleton bean。

获取引用代码:

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;
}
}

最佳答案

有 2 种可能的解决方案。

  1. 如果您有 JavaEE-7 容器,则可以使用 CDI.current().get(MySingletonClass.class);

  2. 如果您有 JavaEE-6 容器甚至 Java SE 应用程序,那么您可以使用 Apache DeltaSpike BeanProvider .它会尝试从 JNDI 查找 BeanManager,但也会执行其他技巧,如果您没有完整的 EE 容器,这些技巧也可以使用。例如。在 SE 和单元测试中。

您还需要注意,不仅容器已启动,而且上下文已正确激活。这通常是通过 ServletListener 完成的。如果您在 EE 容器中,那么他们会为您注册。如果您使用普通的 tomcat、jetty 等,那么您需要自己激活它。

参见 this example来自 Apache OpenWebBeans。

关于java - 在非托管 CDI Bean 中引用 CDI Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28600457/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com