Java 在非托管CDIBean中引用CDIBean

Java 在非托管CDIBean中引用CDIBean,java,cdi,java-ee-6,openwebbeans,Java,Cdi,Java Ee 6,Openwebbeans,是否可以在使用new关键字创建的类中获取CDIBean的实例?我们目前正在对一个旧的应用程序进行一些增强,每次在我们的应用程序中查找CDI单例bean时,我们都会收到一条消息 获取参考的代码: public class ClassCreatedWithNew{ public void doSomething(){ MySingletonBean myBean = BeanManagerSupport.getInstance().getBean(MySingletonB

是否可以在使用
new
关键字创建的类中获取CDIBean的实例?我们目前正在对一个旧的应用程序进行一些增强,每次在我们的应用程序中查找CDI单例bean时,我们都会收到一条消息

获取参考的代码:

public class ClassCreatedWithNew{
     public void doSomething(){
         MySingletonBean myBean = BeanManagerSupport.getInstance().getBean(MySingletonBean.class);
     }
}
BeanManager支持.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;
    }
}
公共类BeanManager支持{
私有静态最终记录器LOG=Logger.getLogger(BeanManagerSupport.class);
私有静态最终BeanManager支持BeanManager支持=新建BeanManager支持();
专用BeanManager BeanManager;
私有BeanManager支持(){
试一试{
beanManager=InitialContext.doLookup(“java:comp/beanManager”);
}捕获(NamingE例外){
LOG.error(“获取BeanManager实例时出错”,e);
}
}
@抑制警告(“未选中”)
公共T getBean(类clazz){
Iterator>iter=beanManager.getBeans(clazz.Iterator();
如果(!iter.hasNext()){
抛出新的IllegalStateException(“CDI BeanManager找不到请求类型的实例”+clazz.getName());
}
Bean=(Bean)iter.next();
return(T)beanManager.getContext(bean.getScope()).get(bean);
}
公共静态BeanManager支持getInstance(){
返回BeanManager支持;
}
}

有两种可能的解决方案

  • 如果您有一个JavaEE-7容器,那么您可以使用
    CDI.current().get(MySingletonClass.class)

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

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


    请参阅Apache OpenWebBeans。

    您想使用new!创建一个单音CDIBean实例吗@法兰加马里-不,不是这样的。查看我发布的代码以使其更清晰您是否尝试过
    CDI.current().get(MySingletonClass.class)