我有一个页面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
,当包含时,将在后来替换为空的)。所以这样我就得到了原本想要的行为,至少事情看起来像那样。但我认为这种方式肯定是错误的。
非常感谢您对此有任何澄清。