2017-06-22 9 views
1

私はJSF 2.2を使用しており、EL式を使用してマネージドBeanのインスタンスを取得する必要があります。私はマネージドBeanのインスタンスがまだ作成されていない場合、インスタンスを作成する以下のコードを使用しています。 Beanがすでに作成され、メモリ内にある場合(スコープされた変数はセッション中であれば要求、..)、新しい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だけでタグ付けされているので、私はその部分を見落としましたが、完全なコードは常に優れています。しかし、このコードは本当に完璧ですか?私たちが探し求めなければならない他の場所はありますか? –

関連する問題