これが「受け入れられた解決策」であるかどうかはわかりませんが、私にとって有効なアイデアを実装しました。(フィードバックは大歓迎です!)
そこで@SessionScoped
、いくつかの静的マップを持つクラスを作成しました。
private static Map<String, Object> objectVariableMap;
// Getters, setters and methods etc. are omitted for simplicity
キーとして文字列を、値としてオブジェクトを受け入れるマップを指定したという考えです。任意のタイプのオブジェクトをそこに格納できるように、オブジェクトのタイプを特に設定していません。注意点は、元の型にキャストできるように、オブジェクトを取得するときにオブジェクトの型を確認する必要があることです。
ここで最初からデータを設定します@ViewScoped
。Mapキーとしてランダムな UUID (または必要なもの) を生成し、その値を使用しているオブジェクト (つまりthis
、次のビューに渡したい他のオブジェクト) に設定します。キーと値をマップに保存し、URL パラメータをキーに設定します。
URLパラメーターでユーザーIDなどのデータを渡すことに熱心ではありません(暗号化されている場合でも)。このアイデアには、指定可能な寿命を持つ使い捨ての URL 値を提供するという追加の利点があります。
受信側 (つまり、新しい@ViewScoped
Bean、またはその他のスコープ) で、URL パラメータ (マップ キー) を読み取り<f:paramView>
、イベントを使用して、操作preRenderView
するオブジェクトを取得および設定します。
この時点で、マップからキー ペアを削除してそのオブジェクトを取得する機能を無効にするか、変更があった場合にオブジェクトを更新するだけでキー ペアを長期間保持することができます。
更新:概念的には、これは本当に成功しています (少なくとも私にとっては)。概念をより普遍的なものにするために、この概念に関連するいくつかの便利なメソッドとクラスを作成しました。より具体的な指示が必要な場合、または必要に応じて小さなライブラリを作成することさえできます。