Omnifaces preInvokeAction/postInvokeAction 上的侦听器在没有 viewParam 的情况下未被调用

Listener on Omnifaces preInvokeAction/postInvokeAction not invoked without viewParam

我不能 100% 确定这不是设计好的,但似乎只有存在 viewParam 时才会调用视图元数据中的 preInvokeAction 侦听器。

以下作品:

<f:metadata>
    <f:viewParam name="test" value="#{myForm.myValue}"/>
    <f:event type="preInvokeAction" listener="#{myController.initializeForm}"/>
</f:metadata>

但这不是:

<f:metadata>
    <f:event type="preInvokeAction" listener="#{myController.initializeForm}"/>
</f:metadata>

如果没有视图参数,可能是invokeAction阶段不存在,所以没有意义,但我对这个级别的生命周期还不够熟悉,不知道是不是这样,或者如果这只是一个失误。

解决方法是输入一个虚假参数。

有谁知道这是错误还是符合预期?

它确实按设计工作。

这些事件在 INVOKE_APPLICATION 阶段触发。当在 RESTORE_VIEW 阶段没有发现视图参数时,JSF 将立即前进到 RENDER_RESPONSE 阶段。将跳过其间的所有阶段:APPLY_REQUEST_VALUESPROCESS_VALIDATIONSUPDATE_MODEL_VALUESINVOKE_APPLICATION.

解决方法确实是声明一个“虚拟”<f:viewParam>,或者更好的是,使用 <f:viewAction> 提供的 JSF 2.2 而不是 InvokeActionEventListener documentation.

中提到的
<f:viewAction action="#{myController.initializeForm}" />

请注意 <f:viewParam> 不一定需要 bean 属性。

<f:viewParam name="test" />

它将隐式地放置在请求范围内,并作为 #{test}.

可用

另请参阅:

  • What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
  • Invoke JSF managed bean action on page load