2015-05-24 75 views
1

我已使用How to disable elements from within a ViewHandler after jsf has embedded the composite component?的答案以編程方式禁用所有窗體中的所有組件。 A SystemEventListener捕捉並禁用所有組件。在SystemEventListener中注入CDI受管bean

我想添加的是從CDI bean獲取一些邏輯。看來我不能@Inject一個CDI豆SystemEventListener裏面。有沒有其他的機制可以從CDI bean獲取邏輯?我有很多組件,並且將disabled="#{bean.disabled}"添加到所有組件將會非常耗時。據我瞭解,這是「批量禁用」的正確方法,或者我在這裏嚴重錯誤?

+0

檢查omnifaces ['o:massAttribute'](http://showcase.omnifaces.org/taghandlers/massAttribute) – Kukeltje

回答

1

看來你還沒有使用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類的實例變量。

相關問題