ViewScope的ManagedProperty在ViewScoped Bean中 - 瞬态?

时间:2013-01-06 15:34:30

标签: serialization jsf-2 managed-bean transient

我有这种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下的托管属性的问题?

谢谢!

1 个答案:

答案 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;
}