2011-07-15 19 views
2

viewBeanに対する最初の「ポストバックされない」リクエストで、sessionBeanのsomeValueプロパティがnullです。 ポストバック要求で、someValueにユーザー入力を設定しています。問題は、someValueが "nonpostback"要求で常にnullであることです。私は私が何か間違ったことをやっている感じセッションBeanが失われましたか?

@ManagedBean 
@ViewScoped 
public class ViewBean implements Serializable { 

    @ManagedProperty(value = "#{sessionBean}") 
    private SessionBean sessionBean; 

    private String inputText; 

    @PostConstruct 
    public void init() { 
     if (sessionBean.getSomeValue() != null) // ALWAYS NULL 
      doSomething(sessionBean.getSomeValue()); 
    } 

    private void doSomething(String s) {} 

    public void action(final ActionEvent ae) { 
     sessionBean.setSomeValue(getInputText()); 
     doSomething(getInputText()); 
    } 

    GETTERS/SETTERS 
} 

@ManagedBean 
@SessionScoped 
public class SessionBean implements Serializable { 

    private String someValue; 

    GETTER/SETTER 
} 

: はここに私のコードです。私はMojarra 2.1.2を使用しています アドバイスをいただければ幸いです。ありがとうございました。

UPDATE: 両方の方法(initとアクション)にevaluateExpressionGetを使用したが、正常に動作します:

FacesContext context = FacesContext.getCurrentInstance(); 
SessionBean sessionBean = context.getApplication().evaluateExpressionGet(context, 
    "#{sessionBean}", SessionBean.class); 

答えて

4

これは既知の問題です:

SessionScoped bean inside a ViewScoped bean is resolved as different bean depending on the expression used

私はただのメソッドを保存状態を変更しました私のweb.xml:

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 
+0

我々はclient' 'に' javax.faces.STATE_SAVING_METHOD'を維持したい場合は、任意のソリューションを持続し、新たな価値の力でrefreshSessionを()を呼び出しますか? – blo0p3r

0

I GAE(Google App Engine)を使用し、javax.faces.STATE_SAVING_METHODをクライアントに設定する必要があります。この問題は回避策があります。アクションの後、ちょうどセッションオブジェクトが

protected void refreshSession(){ 
    saveSession(CeaConst.SESSION_ATTR_NAME_LAST_REFRESH_TIME, new java.util.Date()); 
} 
関連する問題