JSF bean: вызов функции @PostConstruct после установки ViewParam

У меня есть product.xhtml и ProductBean. Я использую /product/ {id} для доступа к продуктам, поэтому у меня есть viewParam в product.xhtml со значением = ProductBean.id. Проблема в том, что внутри bean я использую функцию init с аннотацией PostConstruct, чтобы заполнить детали продукта. Для этого мне нужен идентификатор для вызова внешней функции. Я предполагаю, что хотя init вызывается до того, как viewParam устанавливает идентификатор bean, и поэтому внутри init я не могу вызвать внешнюю функцию, потому что id еще не установлен. Что я делаю неправильно и как это исправить?

ОБНОВЛЕНИЕ

Я понял, что случилось. Я думаю, что метод viewParam работает с CDI beans, но метод ManagedProperty работает с JSF beans..

У меня есть еще одна проблема. Мой CDI bean является RequestScoped, и когда product.xhtml визуализируется, создается bean, и я думаю, что он позже будет отброшен. Самое забавное, что у меня есть функция внутри bean, которая, когда я вызываю, могу прочитать идентификатор (который я предполагаю, что это происходит, потому что связано с параметром вида), но не с любыми другими свойствами. Любые идеи, как это исправить?

Ответ 1

Вместо этого вам понадобится <f:event type="preRenderView">.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>

С

public void onload() {
    // ...
}

Обратите внимание, что это по сути немного взломать. Предстоящий JSF 2.2 предложит новый и более разумный тег с единственной целью: <f:viewAction>.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>

См. также: