我遇到org.omnifaces.util.Faces#redirect和conversation scoped bean的问题:
有一个按钮
<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>
在初始化我的会话范围bean之后必须在同一会话范围内导航到createCar页面:createHandler。
在NavigationHandler中#gotoCreateCar只是对Faces.redirect(createCarPage)的调用。
如果我这样做,参数cid不会转移,我会失去对话。
如果我在faces-config.xml中定义导航规则:
<navigation-case>
<from-outcome>createCar</from-outcome>
<to-view-id>/portal/createCar.xhtml</to-view-id>
<redirect />
</navigation-case>
并在NavigationHandler#gotoCreateCar中返回所需的结果 - 然后就可以了。
也许我不理解这两种导航方法之间差异的每一个细节。如果有人能帮我理解这个问题,我将不胜感激。
谢谢!
答案 0 :(得分:3)
会话传播由导航处理程序处理。 Faces#redirect()
ExternalContext#redirect()
代表Faces#navigate()
不使用导航处理程序。您最好使用NavigationHandler#handleNavigation()
代替{{3}}。
public void gotoCreateCar() {
// ...
Faces.navigate("/portal/createCar.xhtml?faces-redirect=true");
}
(注意:在这种情况下不需要<navigation-case>
)
或者,只需从action方法中返回该字符串。
public String gotoCreateCar() {
// ...
return "/portal/createCar.xhtml?faces-redirect=true";
}
Faces#navigate()
仅在您不在支持返回导航案例结果的(侦听器)方法内时才有用,例如@PostConstruct
或preRenderView
。