Jsf Omnifaces.redirect失去对话范围

Jsf Omnifaces.redirect失去对话范围,jsf,redirect,jsf-2.2,omnifaces,conversation-scope,Jsf,Redirect,Jsf 2.2,Omnifaces,Conversation Scope,我对org.omnifaces.util.Faces#重定向和会话范围bean有问题: 有一个按钮 <p:commandButton action="#{navigationHandler.gotoCreateCar}" actionListener="#{createHandler.init(searchHandler.search())} value="#{msg.search}" update=":articleSearchForm"> <f:param na

我对org.omnifaces.util.Faces#重定向和会话范围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>

会话传播由导航处理程序处理。不使用导航处理程序的委托。您最好使用要访问的代理

(注意:在这种情况下不需要

或者,只需从action方法返回该字符串即可

public String gotoCreateCar() {
    // ...

    return "/portal/createCar.xhtml?faces-redirect=true";
}    

Faces#navigate()
仅在(侦听器)方法中有用,该方法不支持返回导航案例结果,例如
@PostConstruct
preRenderView

好的,谢谢!您还可以解释一下ExternalContext#redirect和导航处理程序redirect之间的区别吗?一个不使用JSF导航处理程序,而另一个使用。因此导航处理程序除了处理会话外,还处理重定向,ExternalContext只执行普通重定向?对不起,我只是想为我澄清一下这个问题。如前所述,会话传播由JSF导航处理程序处理。
ExternalContext#redirect()
不使用JSF导航处理程序。它只是在响应上设置“普通”HTTP
位置
头,而不需要对给定路径进行任何操作。JSF导航处理程序支持对此进行更细粒度的控制,例如,它可以将给定路径解释为(相对)JSF视图ID,并根据当前对话状态或其他特定参数(如
面重定向
includeViewParams
)执行一些附加操作,请注意,我答案中的蓝色文本实际上是指向文档的链接(与往常一样)。单击它们以查看和阅读文档。那边也有解释。
public void gotoCreateCar() {
    // ...

    Faces.navigate("/portal/createCar.xhtml?faces-redirect=true");
}
public String gotoCreateCar() {
    // ...

    return "/portal/createCar.xhtml?faces-redirect=true";
}