Omnifaces Faces.redirect失去了对话范围

时间:2014-06-17 08:34:15

标签: jsf redirect jsf-2.2 omnifaces conversation-scope

我遇到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中返回所需的结果 - 然后就可以了。

也许我不理解这两种导航方法之间差异的每一个细节。如果有人能帮我理解这个问题,我将不胜感激。

谢谢!

1 个答案:

答案 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()仅在您不在支持返回导航案例结果的(侦听器)方法内时才有用,例如@PostConstructpreRenderView