JSFの落とし穴

とあるプロジェクトで、JSF2.2(Myfaces)の技術検証を行っているのですが、ステートフルであるが故の落とし穴がありということに気づきました。

JSF2系で登場した便利な機能も非機能面で深掘りをしてみると、うーんそういう動き方をするのね というところがあります。

 
例えば、ViewScoped(javax.faces.view.ViewScoped)なバッキングビーンは、別Viewへ遷移時にインスタンスが即破棄されていると思いがちであるが、実はそうではないらしいです。
myfaces+weldで試したところ、即時削除はされなかったです。
インスタンスの最大数が決められており、それを超えた場合にLRUで削除される実装になっていました。
なので、複数タブを開いて、何回か画面遷移をしてしまうと、古い片方のタブのViewScopedなビーンが削除されてしまいます。
この動きはviewstateも同じで、古いものから削除されるので、複数タブで画面遷移を行っていると、片方のタブのviewstateが削除されてしまい、ViewExpiredExceptionになってしまいます。

 

あ、これは、SAVING_STATE_METHODがserverの場合ですね。

clientであれば、viewstateはclientに保存されるので、知らぬ間に削除されてしまうなんてことは起きません。

 

JSFの肝である、ステートレスなHTTPを無理やりステートフルに見せかけるという手法はやはり限界があるのかもしれません。