如果bean ViewScoped </p:poll>,PrimeFaces <p:poll> refresh使支持bean成员无效

时间:2012-07-12 11:52:54

标签: jsf jsf-2 primefaces

我正在使用PrimeFaces UI库和JSF 2.

我有一个支持bean:

public class JobMgmtBean extends ClientBeanBase implements Serializable

public class ClientBeanBase extends BeanBase

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

我想将JobMgmtBean从请求范围设置为查看作用域,但过了一段时间sessionVars 中定义的BeanBase变为空并且bean不再具有功能了。

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

protected Map<String,Object> sessionVars = null;

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

我每隔5秒刷新页面上的一些PrimeFaces UI组件(使用<p:poll interval="5"...>),并在几次刷新后sessionVars变为空。

为什么会这样?

2 个答案:

答案 0 :(得分: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引用都可以将其标记为 transient

private transient Bean bean.
  

这个bean不会被序列化,但问题是你有责任   在方法钩子中对其进行去细化时设置引用   “的readObject”

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

答案 1 :(得分:0)

ViewScoped bean需要对象进行序列化,并且我的类扩展了许多具有太多对象的类,这些对象都需要序列化,这是不可能的。这意味着我根本不能使用ViewScoped。