我有这种JSF Beans结构:
@ManagedBean
@ViewScoped
public class ViewBeany implements Serializable {
....
@ManagedProperty(value='#{sessionBeany})
transient private SessionBeany sessionBeany;
...
public getSessionBeany() { ... };
public setSessionBeany(SessionBeany sessionBeany) { ... };
}
transient
的原因是会话bean有一些非Serializable成员,不能成为Serializable。
这会起作用吗?
如果没有,我如何解决无法序列化SesionBeany
但必须将其保留为视图范围bean下的托管属性的问题?
谢谢!
答案 0 :(得分:12)
这不起作用。如果序列化视图范围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;
}