2017-06-22 63 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标记,但完整的代码总是更好。但是这个代码真的完成了吗?有其他地方我们应该查找吗? –