OmniFaces的enableRestorableView恢复空视图根

时间:2013-05-28 12:24:24

标签: jsf-2 omnifaces

我有一个页面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请求/响应就会发生。一些挖掘细节的人告诉我,导航/重定向通常由Invoke Application阶段的UICommand触发,但<o:enableRestorableView />恢复的视图根似乎根本没有子节点。因此,没有命令组件可以调用必须处理重定向的默认动作侦听器。

我正在使用Mojarra 2.1.19和OmniFaces 1.4.1。我可以在消息来源中看到RestorableViewHandler创建视图但不构建它:它可能是空UIViewRoot的原因吗?显然,有一些我茫然失踪和误解......

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

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

0 个答案:

没有答案