ManagedProperty系列化(Serialization of ManagedPropert

2019-07-30 01:49发布

我们与JSF的以下问题@ViewScoped@ManagedProperty :我们有ManagedBean s表示基本上如下所示:

@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将被序列化特殊处理,特别是,这将是“重新连接”反序列化后。 然而,事实证明,反序列化后sessionConfig仅仅是实际SessionConfig豆的陈旧克隆。

问题:

  1. 这是预期的行为?
  2. 我们可以做些什么,使JSF重新评估@ManagedProperty反序列化后?

目前,我们在“手动”重新评估deserialzation毕竟管理特性。 它但是,很显然,似乎作品不正确的。

谢谢!

Answer 1:

一种解决方法是避免在@ManagedProperty豆@ViewScoped和评估需求EL表达式。 @ViewScoped豆会在每个请求结束被存储在会话(从而串行化)。

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

请注意,这可能会严重影响perfromance如果表达式必须频繁评估。

一个更好的形式给出可能提供自定义的序列化方法如下所述: http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html这样的表达可以自动每次bean被反序列化的时间来解决。



文章来源: Serialization of ManagedProperty