2012-01-10 105 views
1

我在我的項目中的以下問題:JSF SessionScoped managedBean與ViewScoped managedBean結合

我們有2種具有以下配置管理的豆類:

@ManagedBean 
@SessionScoped 
public class SessionBean { 
    private PersonnelFile personnelFile; // + getters/setters 
} 

@ManagedBean 
@ViewScoped 
public class ViewBean { 
    @ManagedProperty("#{sessionBean}") 
    private SessionBean sessionBean; 

    public void selectPersonnel() { 
     sessionBean.getPersonnelFile().setPerson(new Person()); 
    } 
} 

這還不是全部的代碼,但它給你的sitatution的總體思路:

  • SessionScoped豆,其保存會話對象
  • 的Vie wScoped豆持有視圖相關的對象,並在SessionScoped bean的引用

現在的問題是:

  • 訪問我的看法
  • 我做了幾個後背上,以相同的看法,每次回到視圖..到目前爲止這麼好
  • 在某個特定時刻,我使用來自視圖的信息在SessionScoped bean中設置了會話對象,並且保留了我的視圖...迄今爲止這麼好
  • 現在,當我回到th是視圖,他創建一個新的ViewScoped bean實例(如預期的)並設置SessionScoped bean(因爲ManagedProperty註釋)
  • 當我調試這個時,我可以看到對SessionScoped bean的引用保持不變,所以這是同一個對象
  • 不過,我以前在SessionScoped豆集已經成爲null對象,這意味着他「丟失」有關該對象的會話信息
  • 我從來不重置在SessionScoped豆這個對象,所以我不看看它可能出錯的地方...

如果你想要更多的解釋或如果你希望我更好地說出這個問題,讓我知道或使用編輯按鈕!

+1

*「我永遠不會重置在SessionScoped豆這個對象」 *。在代碼中肯定會有一些東西改變了這個屬性。沒有魔法。根據迄今爲止提供的信息,我們不能指出任何可能的原因。您需要在調試器中的'private Person person;'行上放置一個可變監視斷點。然後你可以檢查試圖改變它的堆棧。 – BalusC 2012-01-10 17:02:53

+0

我想我們可能已經發現了這個問題。在我們的web.xml,我們使用以下設置: '<的context-param> ​​javax.faces.STATE_SAVING_METHOD 服務器 ' – 2012-01-11 08:21:02

+0

嗯,該JSF你正在使用的是impl/version嗎? – BalusC 2012-01-11 13:01:20

回答

0

@BalusC 我想我們可能已經發現了這個問題。在我們的web.xml中,我們使用以下設置:

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 

現在,如果我理解正確的話,我們無法通過此設置一個視圖作用域的bean編輯會話範圍bean的狀態...我們能夠改變會話作用域bean的狀態的唯一方法是在bean本身的構造函數或PostConstruct方法中。在視圖範圍的bean內部對會話範圍的bean所做的更改不會在服務器上保留。

如果我們把這個變量設置爲'server',那麼這個狀態確實會在服務器上保留下來,而不是每次都傳送給客戶端。我知道這會給內存帶來更多的負載,但我想知道如何通過使用client方法解決我們的問題。

所以,我的問題是固定的,但我不知道,如果解決方案是理想的...