ViewScopeでやたらハマるので落とし穴をまとめた。
リクエスト毎にインスタンスが再生成される ViewScopeなのでURLが変わらないうちはインスタンスはずっと保持されるんだろうと思ったら、そうではないっぽい。 初回表示のGET時とPOST BACK時でBacking Beanのインスタンスが違う。勿論そのフィールド変数も違う。値は同じものが入っている。毎回serialize, deserializeされているようだ。 そうするとDDDでいうところのEntityをBacking Beanのフィールドに持たせるといつの間にか別のオブジェクトになっていてバグる。勿論ValueObjectなら問題無い。
ViewScopeなBacking Beanはrestore view phaseではまだ復元されていない。そのため、binding attributeなどでViewにバインディングするとエラーになる
参考:
http://balusc.omnifaces.org/2010/06/benefits-and-pitfalls-of-viewscoped.html