2012-07-12 51 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 = ................ 
    } 
相关问题