【发布时间】:2014-02-11 00:49:09
【问题描述】:
我的一些 viewParams 是强制性的,当它们丢失时会显示 FacesMessage。但是系统事件 preRenderView 是在搜索参数为空的情况下执行的,因此返回了默认的数据结果。有没有办法阻止 preRenderView 注册的方法在违反所需属性时执行?
【问题讨论】:
标签: jsf-2 viewparams
我的一些 viewParams 是强制性的,当它们丢失时会显示 FacesMessage。但是系统事件 preRenderView 是在搜索参数为空的情况下执行的,因此返回了默认的数据结果。有没有办法阻止 preRenderView 注册的方法在违反所需属性时执行?
【问题讨论】:
标签: jsf-2 viewparams
<f:event type="preRenderView"> 在此构造中本质上是一种破解/解决方法。正如它的名字所说,确实 always 在渲染响应阶段之前调用,无论类型请求(回发与否)和验证结果(失败与否)。在这个相关问题中也对此进行了详细阐述:What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for? 这包含以下 sn-p 应该可以进一步帮助您:
public void init() {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
// ...
}
}
用所需的逻辑代替// ...。
在 JSF 2.2 中,可以使用<f:viewAction> 风格的标准解决方案,在上述相关问题中也进行了演示。
【讨论】:
我还没有查看代码,但是从 docs 开始,preRenderView 在构造视图中的 anything 之前开始。所以应用程序甚至不知道有一个要验证的视图参数。
您可能需要在事件方法中检查所需的参数或使用 JSF-2.2 的新 f:viewAction,这似乎是您真正想要的。
如果您可以添加/已经在使用 Omnifaces,则有 InvokeActionEventListener,它在分配了 <f:viewParam>s 之后运行:
<f:event listener="#{bean.myListener()}" type="postInvokeAction" />
【讨论】: