2012-07-12 52 views
0

我使用PrimeFaces UI庫和JSF 2PrimeFaces <p:poll>刷新無效後臺bean的成員,如果豆ViewScoped

我有一個支持bean:

public class JobMgmtBean extends ClientBeanBase implements Serializable 

public class ClientBeanBase extends BeanBase 

(所以繼承是JobMgmtBean:ClientBeanBase:BeanBase)。

我想設置我JobMgmtBean從請求範圍以查看範圍的,但同時我sessionVars這是在BeanBase定義後變成空和bean不能正常工作了。

我在BeanBase這樣初始化sessionVars

protected Map<String,Object> sessionVars = null; 

ex = FacesContext.getCurrentInstance().getExternalContext(); 
sessionVars = ex.getSessionMap(); 

我刷新我的一些PrimeFaces UI組件的每5秒(使用<p:poll interval="5"...>)頁面上,和幾個刷新後sessionVars變爲零。

爲什麼會發生這種情況?

+0

ClientBeanBase和BeanBase都是deserailized也註釋爲@ManagedBean?如果是這樣,他們有什麼範圍?代碼「sessionVars = ex.getSessionMap();」在哪裏?在構造函數中? postconstruct? – Damian 2012-07-12 12:17:52

+0

'ClientBeanBase'和'BeanBase'不是託管bean,所以沒有它們的範圍。 'sessionVars'位於'JobMgmtBean'構造函數中調用的initBeanBase()中。這有幫助嗎? – Danijel 2012-07-12 12:51:29

+0

I ment BeanBase :: intiBeanBase()。 – Danijel 2012-07-12 13:25:10

回答

0

ViewScoped bean需要對象進行序列化,而我的類擴展了很多具有太多對象的類,這些對象都需要序列化,這是不可能的。這意味着我無法在這裏使用ViewScoped。

1

您可以使用View範圍,只要您可以在反序列化過程中組裝對象的狀態。

Java爲可以執行自定義邏輯的可序列化類提供了方法掛鉤。

private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { 
     //custom logic 
     stream.defaultWriteObject(); 
    } 

    private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { 
     stream.defaultReadObject(); 
     // custom logic 
    } 

任何bean的引用,你認爲你不希望序列化,你可以將其標記爲短暫

private transient Bean bean. 

這個bean不會得到序列化,但問題是,你有責任 設置參考回來時,它的方法鉤 「的readObject」

private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { 
     stream.defaultReadObject(); 
     // custom logic 
     this.bean = ................ 
    } 
相關問題