Ben*_*Ben 6 serialization transient jsf-2 managed-bean
我有这种JSF Beans结构:
@ManagedBean
@ViewScoped
public class ViewBeany implements Serializable {
....
@ManagedProperty(value='#{sessionBeany})
transient private SessionBeany sessionBeany;
...
public getSessionBeany() { ... };
public setSessionBeany(SessionBeany sessionBeany) { ... };
}
Run Code Online (Sandbox Code Playgroud)
原因transient是会话bean有一些非Serializable成员,不能成为Serializable.
这会有用吗?
如果没有,我如何解决无法序列化SesionBeany但必须将其作为托管属性保存在视图范围内的bean的问题?
谢谢!
Bal*_*usC 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;
}
Run Code Online (Sandbox Code Playgroud)