Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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 在SystemEventListener中注入CDI托管bean_Jsf_Cdi_Managed Bean_Systemeventlistener - Fatal编程技术网

Jsf 在SystemEventListener中注入CDI托管bean

Jsf 在SystemEventListener中注入CDI托管bean,jsf,cdi,managed-bean,systemeventlistener,Jsf,Cdi,Managed Bean,Systemeventlistener,我使用answer以编程方式禁用所有形式的所有组件。SystemEventListener捕获并禁用所有组件 我想补充的是从CDIBean中获取一些逻辑。似乎我无法在SystemEventListener中@注入CDIBean。是否有其他机制从CDIBeans获取逻辑?我有很多组件,将disabled=“#{bean.disabled}”添加到所有组件将非常耗时。据我所知,这是“批量禁用”的正确方法,否则我就大错特错了?看来您还没有使用JSF2.2。自该版本以来,许多JSF工件都符合CDI注入的

我使用answer以编程方式禁用所有形式的所有组件。
SystemEventListener
捕获并禁用所有组件


我想补充的是从CDIBean中获取一些逻辑。似乎我无法在
SystemEventListener
@注入CDIBean。是否有其他机制从CDIBeans获取逻辑?我有很多组件,将
disabled=“#{bean.disabled}”
添加到所有组件将非常耗时。据我所知,这是“批量禁用”的正确方法,否则我就大错特错了?

看来您还没有使用JSF2.2。自该版本以来,许多JSF工件都符合CDI注入的条件,包括
SystemEventListener
实例。另见。如果您在支持Servlet3.0的容器上运行JSF2.0/2.1,那么升级到JSF2.2应该是最小的工作量

如果由于某种原因无法升级,那么可以通过JNDI以编程方式获取CDI托管bean。CDI
BeanManager
实例可从JNDI名称
java:comp/BeanManager
获得。一旦有了它,使用下面的
getReference()
utility方法获取感兴趣的参考

public static <T> T getReference(BeanManager beanManager, Class<T> beanClass) {
    Bean<T> bean = resolve(beanManager, beanClass);
    return (bean != null) ? getReference(beanManager, bean) : null;
}

public static <T> Bean<T> resolve(BeanManager beanManager, Class<T> beanClass) {
    Set<Bean<?>> beans = beanManager.getBeans(beanClass);

    for (Bean<?> bean : beans) {
        if (bean.getBeanClass() == beanClass) {
            return (Bean<T>) beanManager.resolve(Collections.<Bean<?>>singleton(bean));
        }
    }

    return (Bean<T>) beanManager.resolve(beans);
}

public static <T> T getReference(BeanManager beanManager, Bean<T> bean) {
    return (T) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
}
或者,如果您已经在使用OmniFaces 1.x,或者愿意使用它,请使用它的
bean
实用程序类(仅从1.6开始提供):

两者都返回一个代理引用,您可以在构建过程中将其安全地分配为
SystemEventListener
类的实例变量。

检查omnifaces
BeanManager beanManager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager");
YourBean yourBean = getReference(beanManager, YourBean.class);
// ...
YourBean yourBean = Beans.getReference(YourBean.class);
// ...