2017-06-22 1 views
1

J'utilise JSF 2.2 et j'ai besoin d'obtenir une instance du bean géré en utilisant EL Expression. J'utilise le code ci-dessous qui crée une instance du bean géré s'il n'est pas déjà créé. Si le bean est déjà créé et est en mémoire (quelle que soit la variable, qu'il s'agisse de session, request, ..), il renvoie l'instance du bean géré sans en créer une nouvelle. Mon exigence est, si le bean n'est pas déjà créé, alors il devrait retourner null et ne pas créer une nouvelle instance. Si c'est déjà créé, alors il devrait retourner cette instance. Mais le code ci-dessous, finit par en créer un s'il n'existe pas. J'espère que je suis clair.EL Expression en JSF 2.2

public static MyManagedBean getMyManagedBean() { 

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

}

Répondre

2

Ceci est la version simple (mais bavard):

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

Merci pour votre réponse. Je vais essayer ça. – dontnetnewbie

+1

Notez que cela ne fonctionne pas pour les beans gérés par CDI. – BalusC

+0

@BalusC J'ai complété le code pour travailler aussi avec les beans gérés par CDI. J'ai négligé cette partie puisque la question est marquée seulement avec JSF, néanmoins le code complet est toujours meilleur. Mais ce code est-il vraiment complet? Y a-t-il d'autres endroits où nous devrions regarder? –