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