ManagedProperty的序列化

时间:2012-06-21 15:04:01

标签: jsf-2 deserialization managed-bean view-scope

我们在JSF的@ViewScoped@ManagedProperty中遇到以下问题:我们的ManagedBean基本上如下所示:

@ManagedBean
@SessionScope
public class SessionConfig implements Serializable
{
    // ...
}

@ManagedBean
@ViewScope
public class SomeController implements Serializable
{
    @ManagedProperty( value="#{sessionConfig}" )
    private SessionConfig sessionConfig;
    // public getter and setter

    // ...
}

按照预期处理请求后,控制器将被序列化。 我预计@ManagedProperty sessionConfig将在序列化中特别处理,特别是它将重新链接到#34;反序列化后。但是,事实证明,在反序列化之后sessionConfig只是实际SessionConfig-Bean的陈旧克隆。

问题:

  1. 这是预期的行为吗?
  2. 我们可以做些什么来让JSF在反序列化后重新评估@ManagedProperty
  3. 目前,我们"手动"反序列化后重新评估所有托管属性。它有效,但显然似乎不对。

    谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案是避免@ViewScoped bean中的@ManagedProperty并根据需要评估EL表达式。 @ViewScoped bean将在每个请求结束时存储在Session中(并因此被序列化)。

FacesContext ctx = FacesContext.getCurrentInstance();
ctx.getApplication().evaluateExpressionGet(ctx, "#{sessionConfig}", SessionConfig.class)

请注意,如果必须经常评估表达式,这可能会严重影响性能。

更好的方法可能是提供自定义序列化方法,如下所述:http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html 这样,每次反序列化bean时都可以自动解析表达式。