我有这样的 JSF Beans 结构:
@ManagedBean
@ViewScoped
public class ViewBeany implements Serializable {
....
@ManagedProperty(value='#{sessionBeany})
transient private SessionBeany sessionBeany;
...
public getSessionBeany() { ... };
public setSessionBeany(SessionBeany sessionBeany) { ... };
}
原因是transient
问题是会话 bean 具有一些不可序列化的成员,并且无法使其可序列化。
这行得通吗?
如果没有的话如何解决无法序列化的问题SesionBeany
但必须将其保留为视图作用域 bean 下的托管属性?
Thanks!
这行不通。如果视图作用域 bean 被序列化,则所有transient
字段被跳过。 JSF 不会在反序列化后重新注入托管属性,因此您最终会得到一个视图范围的 bean,而没有会话范围的 bean 属性,这只会导致 NPE。
在这个特定的构造中,最好的选择是在 getter 中引入延迟加载,并通过 getter 而不是通过直接字段访问来获取会话 bean。
private transient SessionBeany sessionBeany;
public SessionBeany getSessionBeany() { // Method can be private.
if (sessionBeany == null) {
FacesContext context = FacesContext.getCurrentInstance();
sessionBeany = context.getApplication().evaluateExpressionGet(context, "#{sessionBeany}", SessionBeany.class);
}
return sessionBeany;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)