Omnifaces上的监听器preInvokeAction / postInvokeAction在没有viewParam的情况下不会被调用

时间:2016-05-19 13:36:02

标签: jsf omnifaces

我并非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阶段可能不存在,因此它没有意义,但我对这个级别的生命周期不熟悉,不知道是否这样做了#39。是这样的,或者这只是一次失败。

解决方法是输入一个伪造的参数。

有人知道这是错误还是预期?

1 个答案:

答案 0 :(得分:1)

它确实按设计工作。

INVOKE_APPLICATION阶段触发这些事件。如果在RESTORE_VIEW阶段没有发现视图参数,那么JSF将立即进入RENDER_RESPONSE阶段。中间的所有阶段都将被跳过:APPLY_REQUEST_VALUESPROCESS_VALIDATIONSUPDATE_MODEL_VALUESINVOKE_APPLICATION

解决方法确实是宣布“虚拟”<f:viewParam>,或更好,使用<f:viewAction>提供的<f:viewAction action="#{myController.initializeForm}" /> 而不是InvokeActionEventListener documentation中提到的。

<f:viewParam>

请注意,<f:viewParam name="test" /> 不一定需要bean属性。

#{test}

它将隐式放在请求范围内,并以set desktopFolder to path to desktop tell application "Finder" set a to folder "Files:" of desktopFolder set b to folder "Copies:" of desktopFolder duplicate every file of a to b end tell 提供。

另见: