JSF2.0 の新しい ViewScope には次の問題があります。
@PostConstruct メソッドでビュー スコープ Bean として注釈が付けられたクラスがあります。
@ManagedBean(name = "userListController")
@ViewScoped
public class UserListController {
private String text = "myText";
@PostConstruct
public void init() {
System.out.println("init") ;
}
}
メイン ページ (/pages/main.xhtml) には、UserListController Bean のプロパティ「テキスト」を出力する 2 番目のページ (/pages/user/list.xhtml) に移動するためのボタンがあります。
ボタンは次のとおりです。
<h:commandButton value="Manage Users" action="gotoUsers"/>
faces-config.xml のナビゲーション ケースは次のとおりです。
<navigation-rule>
<from-view-id>/pages/main.xhtml</from-view-id>
<navigation-case>
<from-outcome>gotoUsers</from-outcome>
<to-view-id>/pages/user/list.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
Firefox/Chrome を使用してボタンをクリックすると、 @ViewScoped Bean の @PostConstruct メソッドが 2 回呼び出されるのに対し、IE8 を使用するとメソッドは 1 回だけ呼び出されます。
私が見る単純なフェーズトラッカーで(FF / Chromeの例で):
DEBUG - PhaseTracker - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker - BEFORE - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker - AFTER - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker - BEFORE - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker - AFTER - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker - BEFORE - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker - AFTER - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker - BEFORE - INVOKE_APPLICATION 5
DEBUG - PhaseTracker - AFTER - INVOKE_APPLICATION 5
DEBUG - PhaseTracker - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker - AFTER - RENDER_RESPONSE 6
DEBUG - PhaseTracker - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker - AFTER - RENDER_RESPONSE 6
私は何か間違ったことをしていますか?
このフォーラムから、コンポーネント バインディングが含まれている場合に ViewScope にバグがあることがわかりますが、私の Bean は実際には文字列にすぎません (もちろん、問題は非常に複雑な例に由来します。 @PostConstruct メソッドですが、例を最小限に抑えようとしました)