Jsf PrimeFaces<;p:民意测验>;如果bean ViewScope为,刷新将使支持bean成员无效

Jsf PrimeFaces<;p:民意测验>;如果bean ViewScope为,刷新将使支持bean成员无效,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在使用PrimeFacesUI库和JSF2 我有一个后盾: public class JobMgmtBean extends ClientBeanBase implements Serializable 及 (因此继承是JobMgmtBean:ClientBeanBase:BeanBase) 我想将我的JobMgmtBean从请求范围设置为查看范围,但过了一段时间,在BeanBase中定义的sessionVars变为null,bean不再起作用 我在BeanBase中初始化sessionV

我正在使用PrimeFacesUI库和JSF2

我有一个后盾:

public class JobMgmtBean extends ClientBeanBase implements Serializable

(因此继承是
JobMgmtBean:ClientBeanBase:BeanBase

我想将我的
JobMgmtBean
从请求范围设置为查看范围,但过了一段时间,在
BeanBase
中定义的
sessionVars
变为null
,bean不再起作用

我在
BeanBase
中初始化
sessionVars
,如下所示:

protected Map<String,Object> sessionVars = null;

ex = FacesContext.getCurrentInstance().getExternalContext();
sessionVars = ex.getSessionMap();
protectedmap sessionVars=null;
ex=FacesContext.getCurrentInstance().getExternalContext();
sessionVars=ex.getSessionMap();
我每5秒刷新页面上的一些PrimeFaces UI组件(使用
),几次刷新后
sessionVars
变为空


为什么会发生这种情况

ViewScope bean需要序列化对象,而我的类扩展了许多类,其中包含了太多的对象,这些对象都需要序列化,这是不可能的。这意味着我不能在这里使用ViewScope

如果可以在反序列化期间组装对象的状态,则可以使用视图范围

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”


ClientBeanBase和BeanBase也被注释为@ManagedBean?如果是,它们有什么作用域?代码“sessionVars=ex.getSessionMap();”在哪里?在构造函数中?postconstruct?
ClientBeanBase
BeanBase
不是托管bean,因此它们没有作用域
sessionVars
位于initBeanBase()中,它在
JobMgmtBean
构造函数中调用。这有帮助吗?I ment BeanBase::intiBeanBase()。您能检查在ajax请求期间bean是否再次被构造吗?(在构造函数或@postconstruct中添加断点或system.out.print可以检查放入sessionVars的对象是否都可序列化,视图范围的bean需要可序列化,因此它引用的所有实例都可序列化。)。
private transient Bean bean.
private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException  {
        stream.defaultReadObject();
        // custom logic
        this.bean = ................ 
    }