2017-06-22 194 views
1

我正在使用JSF 2.2,並且需要使用EL表達式來獲取託管bean的實例。我正在使用下面的代碼創建託管bean的實例,如果它尚未創建。如果這個bean已經被創建並且在內存中(任何作用域變量,比如session,request,..),它將返回這個被管理bean的實例而不會創建一個新的bean。 我的要求是,如果bean尚未創建,那麼它應該返回null而不是創建一個新的實例。如果它已經被創建,那麼它應該返回該實例。但是下面的代碼,如果它不存在,最終會創建一個。 希望我清楚。JSF 2.2中的EL表達式

public static MyManagedBean getMyManagedBean() { 

MyManagedBean bean = (MyManagedBean) getFacesContext().getApplication().getExpressionFactory().createValueExpression(getELContext(), 
     "#{MyManagedBean}", 
     MyManagedBean .class).getValue(FacesContext.getCurrentInstance().getELContext()); 
return bean; 

}

回答

2

這是一個簡單的(但詳細)版本:

public static <T> T resolveBean(String name) 
{ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = context.getExternalContext(); 

    Map<String, Object> requestMap = externalContext.getRequestMap(); 
    Object requestObject = requestMap.get(name); 
    if(requestObject != null) 
    { 
     return (T) requestObject; 
    } 

    Map<String, Object> viewMap = context.getViewRoot().getViewMap(); 
    Object viewObject = viewMap.get(name); 
    if(viewObject != null) 
    { 
     return (T) viewObject; 
    } 

    Map<String, Object> sessionMap = externalContext.getSessionMap(); 
    Object sessionObject = sessionMap.get(name); 
    if(sessionObject != null) 
    { 
     return (T) sessionObject; 
    } 

    Map<String, Object> applicationMap = externalContext.getApplicationMap(); 
    Object applicationObject = applicationMap.get(name); 
    if(applicationObject != null) 
    { 
     return (T) applicationObject; 
    } 

    BeanManager beanManager = CDI.current().getBeanManager(); 
    Bean<T> bean = (Bean<T>) beanManager.resolve(beanManager.getBeans(name)); 
    if(bean != null) 
    { 
     Context cdiContext = beanManager.getContext(bean.getScope()); 
     T instance = cdiContext.get(bean); 
     if(instance != null) 
     { 
      return instance; 
     } 
    } 

    return null; 
} 
+0

謝謝您的答覆。我會試試這個。 – dontnetnewbie

+1

請注意,這不適用於CDI託管的bean。 – BalusC

+0

@BalusC我完成了與CDI託管bean一起工​​作的代碼。我忽略了這個部分,因爲問題僅用JSF標記,但完整的代碼總是更好。但是這個代碼真的完成了嗎?有其他地方我們應該查找嗎? –