0

我有一个页面anchors.xhtml,其中包含一个表单和一个

<h:commandButton action="#{anchorsBean.onRefresh}" value="Refresh" />

它使用重定向提交到同一页面:

public String onRefresh() {
    refresh();
    return "anchors?faces-redirect=true";
}

我想避免ViewExpiredException会话超时或由其他原因引起。为此,我使用了 OmniFaces 的可恢复视图处理程序:

<f:metadata>
    <o:enableRestorableView />
</f:metadata>

但令人惊讶的是,在视图过期的情况下,我的重定向行为会丢失:POST 请求/响应只是发生了。一些对细节的挖掘告诉我导航/重定向通常是UICommand在调用应用程序阶段触发的,但是恢复的视图根<o:enableRestorableView />似乎根本没有孩子。所以根本没有命令组件来调用必须处理重定向的默认操作侦听器。

我正在使用 Mojarra 2.1.19 和 OmniFaces 1.4.1。我可以在RestorableViewHandler创建视图但不构建视图的来源中看到:这可能是空的原因UIViewRoot吗?显然,我公然错过和误解了一些东西......

最有趣的是,当我在自定义异常处理程序中使用 no<o:enableRestorableView />而只是简单地删除ViewExpiredException事件时,一切正常:FacesContext碰巧以某种方式已经包含一个完全构建的UIViewRoot<o:enableRestorableView />包含时,稍后将替换为一个空的)。所以这样我就得到了最初想要的行为,至少事情看起来像那样。但我想这种方式肯定是错误的。

非常感谢您对此的任何澄清。

4

0 回答 0