2013-01-06 15 views
6

私はこの種のJSFビーンズ構造を有する:ViewScoped Bean内のSessionScopeのManagedProperty - Transient?

@ManagedBean 
@ViewScoped 
public class ViewBeany implements Serializable { 

.... 
    @ManagedProperty(value='#{sessionBeany}) 
    transient private SessionBeany sessionBeany; 
... 

    public getSessionBeany() { ... }; 
    public setSessionBeany(SessionBeany sessionBeany) { ... }; 

} 

transientの理由は、セッションBeanは、いくつかの非直列化の会員を有しており直列化を行うことができないということです。

これは機能しますか?
そうでなければ、SesionBeanyをシリアル化できないが、ビュースコープのBeanの下で管理プロパティとして保持する必要があるという問題を解決するにはどうすればよいですか?

ありがとうございます!

+0

あなたはとても制約がないなら、あなたはまた、単にserver' 'にあなたの' STATE_SAVING_MODE'を設定し、完全にクライアントに – kolossus

答えて

12

これは機能しません。ビュースコープ付きBeanがシリアル化されている場合は、すべてtransientフィールドはスキップされます。 JSFはデシリアライズ後に管理プロパティを再投入しないため、セッションスコープのBeanプロパティを持たないビュースコープのBeanになり、NPEのみが発生します。

この特定の構成では、ゲッターに遅延ロードを導入し、直接フィールドアクセスではなくゲッターでセッション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; 
} 
+0

感謝をあなたのビューをシリアル化することを避けることができます。私はJSFにこの問題の「合理化された」解決策がないことに驚いています。私はそれがまれではないと思います。 – Ben

+2

私はすでにステートフルなEJBであってはならないかどうか疑問に思いました。 EJBはシリアライズ可能なプロキシとしてインジェクトされるため、シリアライゼーションを心配する必要はありません。 – BalusC

関連する問題