Jsf PrimeFaces<;p:民意测验>;如果bean ViewScope为,刷新将使支持bean成员无效
我正在使用PrimeFacesUI库和JSF2 我有一个后盾: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
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 = ................
}