[英]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.