6

私はこの種のJSFBeans構造を持っています:

@ManagedBean
@ViewScoped
public class ViewBeany implements Serializable {

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

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

}

その理由はtransient、セッションBeanにシリアライズ不可能なメンバーがいくつかあり、シリアライズ可能にすることができないためです。

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

ありがとう!

4

1 に答える 1

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;
}
于 2013-01-06T15:49:09.040 に答える