ViewScope的ManagedProperty在ViewScoped Bean中 - 瞬态?

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)

  • 我已经想知道它是不是一个有状态的EJB.EJB被注入为可序列化代理,因此您不必担心序列化. (2认同)