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>
См. также: