Метод @PostConstruct вызывается, даже если ManagedBean уже создан (например, на AJAX-вызовах)

У меня есть метод @ViewScope ManagedBean и метод инициализации @PostConstruct. Этот метод вызывается, когда создается новый экземпляр, но также и при каждом вызове ajax. Почему это так?

При вызове AJAX вызывается и выполняется init-Method, но никаких изменений не видно. Например, если я изменяю свойство в init-Method, это видно только при инициализации, а не для AJAX-вызовов. Для AJAX-вызовов изменение значения не является постоянным в @ViewScoped Bean.

Может кто-нибудь сказать, почему это так? Как я могу изменить это?

Ответ 1

Это не нормальное поведение. Это произойдет, если вы привяжете атрибуты обработчика тэга или атрибут binding компонентов JSF к свойству области видимости bean, а частичное сохранение состояния включено. Это называется вопрос 1492, который исправлен в (предстоящем) Mojarra 2.2.

В общем, вы можете распознать обработчики меток из-за отсутствия атрибута rendered. Например. <c:if>, <f:validator>, <ui:include> и т.д. Если вы привязываете атрибут такого обработчика тега к свойству видимого вида bean, как следует

<c:if test="#{viewScopedBean.something}"></c:if>
<h:inputText><f:validator binding="#{viewScopedBean.validate}" /></h:inputText>
<ui:include src="#{viewScopedBean.includePage}" />

то область просмотра bean будет воссоздана каждый раз, когда представление должно быть восстановлено из частично сохраненного состояния. Это проблема с куриным яйцом с областью видимости, потому что для получения нужного вида bean он должен быть извлечен из восстановленного представления.

Это также произойдет, если вы ссылаетесь на свойство видимого вида bean в атрибуте binding компонента JSF.

<h:someComponent binding="#{viewScopedBean.someComponent}" />

См. также: