繁体   English   中英

在SystemEventListener中注入CDI托管bean

[英]Inject CDI managed bean in SystemEventListener

我已经使用了jsf嵌入复合组件后如何从ViewHandler中禁用元素的答案 以编程方式禁用所有形式的所有组件。 SystemEventListener捕获并禁用所有组件。

我想添加的是从CDI bean获得一些逻辑。 看来我不能在SystemEventListener内部@Inject CDI bean。 还有其他一些机制可以从CDI bean获得逻辑吗? 我有很多组件,向所有组件添加disabled="#{bean.disabled}"会非常耗时。 据我了解,这是“批量禁用”的正确方法,还是我在这里很误会?

看来您尚未使用JSF 2.2。 从该版本开始,已经使许多JSF工件可以进行CDI注入,包括SystemEventListener实例。 另请参见JSF 2.2的新增功能? -问题763 如果要在支持Servlet 3.0的容器上运行JSF 2.0 / 2.1,那么升级到JSF 2.2的工作量应该最少。

如果由于某种原因而无法升级,则始终可以通过JNDI以编程方式获取CDI托管bean。 CDI BeanManager实例以JNDI名称java:comp/BeanManager可用。 一旦掌握了它,就可以使用下面的getReference()实用程序方法来获取感兴趣的参考。

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 Beans / BeansLocal

因此,简而言之:

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

或者,如果您已经在使用OmniFaces 1.x,或者愿意使用它,请使用其Beans实用程序类(仅从1.6开始可用):

YourBean yourBean = Beans.getReference(YourBean.class);
// ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM