【问题标题】:Referencing a CDI Bean in a non managed CDI Bean在非托管 CDI Bean 中引用 CDI Bean
【发布时间】: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


【解决方案1】:

有两种可能的解决方案。

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

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

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

请参阅来自 Apache OpenWebBeans 的 this example

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多