Serialization ViewScoped Bean中SessionScope的ManagedProperty-瞬态?
我有这样一个JSFbean结构:Serialization ViewScoped Bean中SessionScope的ManagedProperty-瞬态?,serialization,jsf-2,managed-bean,transient,Serialization,Jsf 2,Managed Bean,Transient,我有这样一个JSFbean结构: @ManagedBean @ViewScoped public class ViewBeany implements Serializable { .... @ManagedProperty(value='#{sessionBeany}) transient private SessionBeany sessionBeany; ... public getSessionBeany() { ... }; public setSe
@ManagedBean
@ViewScoped
public class ViewBeany implements Serializable {
....
@ManagedProperty(value='#{sessionBeany})
transient private SessionBeany sessionBeany;
...
public getSessionBeany() { ... };
public setSessionBeany(SessionBeany sessionBeany) { ... };
}
之所以出现瞬态
,是因为会话bean具有一些不可序列化的成员,因此无法使其可序列化
这行吗?如果不是,我如何解决无法序列化
SesionBeany
但必须将其作为视图范围bean下的托管属性的问题
谢谢 这行不通。如果视图范围的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;
}
如果您没有这样的限制,您也可以将
状态保存模式设置为服务器
,避免将视图序列化到客户端。谢谢。我只是很惊讶JSF没有一个“流线型”的解决方案来解决这个问题,因为我认为这并不罕见。我已经想知道它是否不应该是一个有状态的EJB。EJB是作为可序列化代理注入的,因此您不需要担心序列化。