2012-03-06 10 views
0

JSFには、サーバーの起動時に一度だけ実行されるように、次の初期化スニペットを入れるための適切な場所がありますか?JSFに初期化コードを配置する適切な場所はありますか?

1. ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext(); 
2. HttpSession sesion = (HttpSession)extContext.getSession(true); 
3. String parA = extContext.getInitParameter("parA"); 
4. String parB = someCalculations(parA);  
5. sesion.setAttribute("parB", parB); 

は基本的に私は、web.xmlのコンテキストのparamセクションからパラメータPARAを読んでいくつかの変換をしたい、と(新しいPARBパラメータとして)セッションに含めます。

PostConstructApplicationEventとeager = trueのテクニックは、セッションがこの時点(行4)でnullなので機能しません。 FacesContextが利用できないため、ServletContextListenerの手法が機能しません。

ありがとうございます!

+0

セッションごとにではなく、起動時に1回実行してもよろしいですか?セッション属性を設定しています。 – mrembisz

+0

はい、起動ごとに1回実行します。セッションを忘れた場合、新しいパラメータparBはどこに置くことができますか?つまり、setInitParameter( "parB"、parB)のようなものです。 – webmeiker

+0

どのコードにアクセスする必要があるかによって異なります。 JSF Beanの場合、マネージドBeanは適切な選択肢のように思えます。おそらくアプリケーションスコープです。 – mrembisz

答えて

0

アプリケーションの開始時にセッションがありません。この要件を満たすことは不可能です。

私のようにあなたの要件の解釈:高価なアプリケーションスコープの計算を実行

  • は、管理を経由してこれを行うにはJSFの方法がある

他のスコープには、このアプリケーションスコープの結果を注入します豆。ここではコンテキストパラメータのワンタイム変換を実行するためのアプリケーションスコープのBeanです:

package foo; 

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean 
@ApplicationScoped 
public class SomeCalculationsBean { 
    @ManagedProperty("#{initParam.paraA}") 
    private String paraA; 

    private String someCalculation; 

    public String getParaA() { 
    return paraA; 
    } 

    public void setParaA(String paraA) { 
    this.paraA = paraA; 
    this.someCalculation = //do some transformation 
    } 

    public String getSomeCalculation() { 
    return someCalculation; 
    } 
} 

あなたがそれを必要として、この値は、他のスコープ内に注入することができます。テストされていない

package foo; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class SomeSessionBean { 
    @ManagedProperty("#{someCalculationsBean.someCalculation}") 
    private String paraB; 

    public String getParaB() { 
    return paraB; 
    } 

    public void setParaB(String paraB) { 
    this.paraB = paraB; 
    } 
} 

コード。この実装はJSFアノテーションのサポートを前提としていますが、faces-config.xmlのBean構成でも同じことができます。

+0

努力をいただきありがとうございます。問題が解決しました。私は最後に、eager = trueでアプリケーションスコープでManagedBeanを宣言します。次に、そのコンストラクタで、私はこのように新しいパラメータを設定します:extContext.getApplicationMap()。put( "parB"、parB); – webmeiker

+0

単体テストのために、 'FacesContext.getCurrentInstance()'の代わりにマネージドBeanのコンストラクタを使わずに依存性注入に切り替えることをお勧めします。 – McDowell

+0

アドバイスありがとうございます。 JSFとSpringの初心者です)。私は実際にFacesContext.getCurrentInstance()を大量に使用しています – webmeiker

関連する問題