看來你還沒有使用JSF 2.2。自從該版本以來,很多JSF構件已經符合CDI注入條件,包括SystemEventListener
實例。另見What's new in JSF 2.2? - Issue 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));
}
(從OmniFacesBeans
/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
類的實例變量。
檢查omnifaces ['o:massAttribute'](http://showcase.omnifaces.org/taghandlers/massAttribute) – Kukeltje