2

JSF の@ViewScopedand@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はシリアライズで特別に処理されること、特にデシリアライズ後に「再リンク」されることを期待していました。ただし、デシリアライズ後sessionConfigは、実際の SessionConfig-Bean の古いクローンにすぎないことがわかります。

質問:

  1. これは予想される動作ですか?
  2. @ManagedPropertyデシリアライゼーション後にJSF を再評価させるにはどうすればよいでしょうか?

現在、デシリアライズ後にすべての管理プロパティを「手動で」再評価しています。それは機能しますが、明らかに正しくないようです。

ありがとうございました!

4

1 に答える 1

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 がデシリアライズされるたびに式を自動的に解決できます。

于 2012-07-19T10:30:51.163 に答える