Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 仅获取服务中的CDI托管bean_Jsf 2_Cdi - Fatal编程技术网

Jsf 2 仅获取服务中的CDI托管bean

Jsf 2 仅获取服务中的CDI托管bean,jsf-2,cdi,Jsf 2,Cdi,我的目标是从JSF2ExceptionHandlerWrapper中获取所有服务中CDI管理的bean(某个父类)的集合。注意异常处理程序部分很重要,因为类本身不是有效的注入目标。因此,我的假设(可能不正确)是,我唯一的路由是通过BeanManager编程的 使用BeanManager.getBeans,我可以成功地获得所有可供注入的bean集。我的问题是,当使用BeanManager.getReference获取bean的上下文实例时,如果该bean不存在,将创建该bean。因此,我正在寻找一

我的目标是从JSF2ExceptionHandlerWrapper中获取所有服务中CDI管理的bean(某个父类)的集合。注意异常处理程序部分很重要,因为类本身不是有效的注入目标。因此,我的假设(可能不正确)是,我唯一的路由是通过BeanManager编程的

使用BeanManager.getBeans,我可以成功地获得所有可供注入的bean集。我的问题是,当使用BeanManager.getReference获取bean的上下文实例时,如果该bean不存在,将创建该bean。因此,我正在寻找一种只返回实例化bean的替代方法。下面的代码是我的出发点

public List<Object> getAllWeldBeans() throws NamingException {
    //Get the Weld BeanManager
    InitialContext initialContext = new InitialContext();
    BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager");

    //List all CDI Managed Beans and their EL-accessible name
    Set<Bean<?>> beans = bm.getBeans(AbstractBean.class, new AnnotationLiteral<Any>() {});
    List<Object> beanInstances = new ArrayList<Object>();

    for (Bean bean : beans) {
        CreationalContext cc = bm.createCreationalContext(bean);
        //Instantiates bean if not already in-service (undesirable)
        Object beanInstance = bm.getReference(bean, bean.getBeanClass(), cc);
        beanInstances.add(beanInstance);
    }

    return beanInstances;
}
public List getAllWeldBeans()引发NamingException{
//获取焊接Bean管理器
InitialContext InitialContext=新的InitialContext();
BeanManager bm=(BeanManager)initialContext.lookup(“java:comp/BeanManager”);
//列出所有CDI托管bean及其EL可访问名称

Set这里我们正在浏览我找到的javadoc,它有两个版本的bean实例的get()方法。其中一个在传入创建上下文时,具有与BeanManager.getReference()相同的行为。但是另一个只接受bean引用并返回上下文实例(如果可用)或null

利用这一点,以下是原始方法的版本,它只返回实例化的bean:

public List<Object> getAllCDIBeans() throws NamingException {
    //Get the BeanManager via JNDI
    InitialContext initialContext = new InitialContext();
    BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager");

    //Get all CDI Managed Bean types
    Set<Bean<?>> beans = bm.getBeans(Object.class, new AnnotationLiteral<Any>() {});
    List<Object> beanInstances = new ArrayList<Object>();

    for (Bean bean : beans) {
        CreationalContext cc = bm.createCreationalContext(bean);
        //Get a reference to the Context for the scope of the Bean
        Context beanScopeContext = bm.getContext(bean.getScope());
        //Get a reference to the instantiated bean, or null if none exists
        Object beanInstance = beanScopeContext.get(bean);
        if(beanInstance != null){
            beanInstances.add(beanInstance);
        }
    }

    return beanInstances;
}
public List getAllCDIBeans()引发NamingException{
//通过JNDI获取BeanManager
InitialContext InitialContext=新的InitialContext();
BeanManager bm=(BeanManager)initialContext.lookup(“java:comp/BeanManager”);
//获取所有CDI管理的Bean类型
设置