6

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

谢谢!

4

1 回答 1

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;
}
于 2013-01-06T15:49:09.040 回答