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

этот вопрос уже есть ответ здесь:

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

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

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

1 ответов


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

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

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

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

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

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

Читайте также: