1

在我的 Web 应用程序 JSF2 (mojarra 2.1.20) 中,具有以下代码片段的组件的页面上有一个奇怪的行为:

<h:commandLink ... action="#{cc.attrs.bean.next}">
    <f:ajax execute="@this" render=":#{cc.clientId}" />
</h:commandLink>

该动作next()并不总是被调用。我发现问题与 url 参数 id 出于某种原因有关:

<f:metadata>
    <f:viewParam name="id" value="#{torneoBean.idParam}" required="true" />
</f:metadata>

当我在上面插入 viewParam 时,就会出现问题。但我无法摆脱它。调试 ajax 请求似乎调用了启动、成功、完成事件序列(没有错误),要渲染的组件被正确渲染,但没有触发动作。有没有办法调试这种情况并找出问题的根本原因是什么?

4

1 回答 1

3

显然你没有附加<h:message(s)><f:viewParam id="torneo_id">和/或你没有在每个ajax请求上更新它。否则,您会在其上看到必需的验证错误。具体问题基本上由commandButton/commandLink/ajax action/listener method not invoked or input value not updated的第 3 点涵盖。

至于原因,<f:viewParam>在每个单独的 HTTP 请求上执行,也在 ajax 回发上。发送 ajax 请求时,当前请求中不再存在所需的请求参数,因此<f:viewParam>无法通过所需的验证。

有几种解决方案:

  1. <f:param>在命令组件中保留后续请求的请求参数。

    <h:commandLink ...>
        ...
        <f:param name="id" value="#{param.id}" />
    </h:commandLink>
    
  2. 仅在非回发期间使其成为必需。这仅在页面最初由 GET 请求打开时才有效。但是,如果它是由非重定向导航打开的,那么它仍然会失败。

    <f:viewParam ... required="#{not facesContext.postback}" />
    
  3. 替换<f:viewParam>为由 JSF 实用程序库OmniFaces提供的<o:viewParam>. 它隐式关闭required="true"回发,以便您可以继续使用相同的属性。

    <o:viewParam ... required="true" />
    
于 2013-04-07T00:22:25.620 回答