Области действия и @PostConstruct

Я использую JSF 2, PrimeFacces 3.4 и CDI. У меня есть 2 страницы: page1.xhtml и page2.xhtml. Каждая страница имеет свой собственный управляемый компонент: Page1Bean и Page2Bean.

page1.xhtml имеет <p:remoteCommand>, actionListener которого отображает page2.xhtml.

page2.xhtml содержит 3 компонента под <ui:include> и одну кнопку отправки. Каждый из этих трех компонентов привязан к разным управляемым компонентам Component1Bean, Component2Bean и Component3Bean. Кнопка отправки показывает page1.xhtml.

Эти три ComponentXBean имеют метод @PostConstruct с некоторым кодом инициализации. Я попробовал следующие области действия на этих бобах:

  • @SessionScoped: все работает нормально для одной операции отправки. Когда я повторяю это, эти bean-компоненты не инициализируются повторно с помощью @PostConstruct, потому что они относятся к сеансу.
  • @ViewScoped: @PostConstruct вызывается несколько раз.
  • @ConversationScoped: то же поведение, что и @ViewScoped.

Почему @PostConstruct вызывается несколько раз в области просмотра и диалога? Как я могу позволить им вызываться только один раз за операцию отправки?


person Riya    schedule 24.08.2013    source источник
comment
После того, как я очистил формулировку и улучшил форматирование вопроса, я начинаю полагать, что вы используете атрибут binding для привязки этих компонентов к bean-компонентам. Это правда? И вы используете версию Mojarra старше 2.1.18? Тогда это полностью объясняет причину вашей проблемы с областью просмотра.   -  person BalusC    schedule 24.08.2013


Ответы (1)


Каждый раз запускать код инициализации под preRender, вероятно, неправильно. Поскольку инициализация сотрет данные, которые вы хотите.

Отделите свой preRender от своей инициализации. Вы можете либо подключить их отдельно, либо установить флаг для вызова initialize() только один раз.

По возможности избегайте bean-компонентов с областью сеанса; область видимости сеанса — это признак плохо спроектированных веб-приложений и (в самых простых формах) очень плохой способ реализации межстраничного потока. Передавайте параметры URL или POST между веб-страницами для реализации потока.

При необходимости межстраничные параметры могут быть уникальными дескрипторами для объектов, хранящихся в HttpSession. Но не просто сбрасывайте данные в сеанс, если они не являются действительно глобальными для приложения (например, «loggedInUser») или не ссылаются на уникально выделенный дескриптор.

person Thomas W    schedule 24.08.2013