Omnifaces Faces.redirect теряет сферу общения
У меня проблема с org.omnifaces.util.Faces# редиректом и бобом области видимости:
есть кнопка
<p:commandButton action="#{navigationHandler.gotoCreateCar}"
actionListener="#{createHandler.init(searchHandler.search())}
value="#{msg.search}" update=":articleSearchForm">
<f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
</p:commandButton>
который должен выполнить навигацию, чтобы создать страницу Car в пределах той же области диалога после инициализации моего bean-объекта области видимости: createHandler.
В NavigationHandler #gotoCreateCar это просто вызов Faces.redirect (createCarPage).
Если я так поступаю, параметр cid не передается, и я теряю разговор.
Если я определю правило навигации в face -config.xml:
<navigation-case>
<from-outcome>createCar</from-outcome>
<to-view-id>/portal/createCar.xhtml</to-view-id>
<redirect />
</navigation-case>
а в NavigationHandler #gotoCreateCar просто возвращаем нужный результат - тогда он работает нормально.
Может быть, я не понимаю каждую деталь в разнице между этими двумя подходами навигации. Буду признателен, если кто-нибудь поможет мне понять проблему.
Спасибо!
1 ответ
Распространение диалога обрабатывается обработчиком навигации. Faces#redirect()
делегаты ExternalContext#redirect()
который не использует обработчик навигации. Вы бы лучше использовать Faces#navigate()
вместо этого, который делегирует NavigationHandler#handleNavigation()
,
public void gotoCreateCar() {
// ...
Faces.navigate("/portal/createCar.xhtml?faces-redirect=true");
}
(примечание: нет <navigation-case>
нужен в этом случае)
В качестве альтернативы, просто верните именно эту строку из метода действия.
public String gotoCreateCar() {
// ...
return "/portal/createCar.xhtml?faces-redirect=true";
}
Faces#navigate()
полезно только в том случае, если вы находитесь внутри метода (слушателя), который не поддерживает возвращение результата случая навигации, такого как @PostConstruct
или же preRenderView
,