У меня возникла следующая проблема с новым ViewScope в JSF2.0.
У меня есть класс, аннотированный как компонент области видимости с помощью метода @PostConstruct
@ManagedBean(name = "userListController")
@ViewScoped
public class UserListController {
private String text = "myText";
@PostConstruct
public void init() {
System.out.println("init") ;
}
}
На главной странице (/pages/main.xhtml) есть кнопка для перехода на вторую страницу (/pages/user/list.xhtml), где я выводю свойство "text" компонента UserListController.
Кнопка:
<h:commandButton value="Manage Users" action="gotoUsers"/>
Навигационный регистр в face-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, я вижу, что метод @PostConstruct bean-компонента @ViewScoped вызывается дважды, а если я использую IE8, метод вызывается только один.
С помощью простого фазового трекера (в примере 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, но я попытался свести пример к минимуму)