0

PrimeFaces UI ライブラリと JSF 2 を使用しています。

バッキングビーンがあります:

public class JobMgmtBean extends ClientBeanBase implements Serializable

public class ClientBeanBase extends BeanBase

(したがって、継承は ですJobMgmtBean:ClientBeanBase:BeanBase)。

JobMgmtBeanfrom リクエスト スコープをビュー スコープに設定したかったのですが、しばらくすると、sessionVarsで定義されている myBeanBase が nullになり、Bean が機能しなくなりました。

sessionVars次のBeanBaseように初期化します。

protected Map<String,Object> sessionVars = null;

ex = FacesContext.getCurrentInstance().getExternalContext();
sessionVars = ex.getSessionMap();

ページ上の PrimeFaces UI コンポーネントの一部を 5 秒ごとに ( を使用して<p:poll interval="5"...>) 更新し、数回更新するsessionVarsと null になります。

なぜこれが起こるのですか?

4

2 に答える 2

1

逆シリアル化中にオブジェクトの状態をアセンブルできる場合は、View スコープを使用できます。

Java は、カスタム ロジックを実行できるシリアル化可能なクラスのメソッド フックを提供します。

    private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
        //custom logic
        stream.defaultWriteObject();
    }

    private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException  {
        stream.defaultReadObject();
        // custom logic
    }

シリアライズしたくないと思われる Bean 参照は、それをtransientとしてマークすることができます。

private transient Bean bean.

この Bean はシリアライズされませんが、問題は、メソッド フック「readObject」でデシリアライズされるときに参照を元に戻す責任があることです。

private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException  {
        stream.defaultReadObject();
        // custom logic
        this.bean = ................ 
    }
于 2012-07-13T12:27:06.487 に答える
0

ViewScoped Bean はオブジェクトをシリアライズする必要があり、私のクラスは多くのクラスを拡張し、すべてをシリアライズする必要があるオブジェクトが多すぎますが、これは不可能です。これは、ここでは ViewScoped をまったく使用できないことを意味します。

于 2012-07-13T11:50:05.017 に答える