【问题标题】:h:commandLink f:ajax action not called when page has f:viewParam required="true"h:commandLink f:ajax 操作在页面具有 f:viewParam required="true" 时未调用
【发布时间】:2013-03-29 04:57:58
【问题描述】:

在我的网络应用 JSF2 (mojarra 2.1.20) 中, 在具有以下 sn-p 的组件的页面上有一个奇怪的行为:

<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 请求似乎调用了启动、成功、完成事件序列(没有错误),要渲染的组件被正确渲染但未触发操作。 有没有办法调试这种情况并找出问题的根本原因是什么?

【问题讨论】:

    标签: ajax jsf jsf-2 commandlink viewparams


    【解决方案1】:

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

    至于原因,&lt;f:viewParam&gt; 会在每个 HTTP 请求上执行,也可以在 ajax 回发上执行。发送 ajax 请求时,当前请求中不再存在所需的请求参数,因此 &lt;f:viewParam&gt; 未通过所需的验证。

    有几种解决方案:

    1. 在命令组件中保留&lt;f:param&gt;后续请求的请求参数。

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

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

      <o:viewParam ... required="true" />
      

    【讨论】:

    • 感谢 BalusC!解决方案 #2 解决了我的问题,但总的来说,我该如何调试这样的问题? h:message 肯定会有所帮助,但我是否可以使用相位侦听器来捕获此问题(一种行为不当检测器)以及与未调用的操作相关的所有其他问题?
    • 记录当前阶段的阶段监听器确实暗示了更新模型值和调用应用程序阶段被跳过。此外,您是否注意到 JSF 记录了排队但未显示的消息?至少,Mojarra 做到了。作为最后的手段,好吧,在FacesServlet#service() 中设置一个断点并在那里推进表格也应该提供很多洞察力。这样做的次数越多,您就越了解 JSF 生命周期,并且越容易发现潜在问题。
    • 奇怪的是,在日志中没有跟踪有关排队和未显示消息的错误或警告。日志很干净,这就是为什么我问了一种调试方法。这对于像这样的情况绝对有帮助。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2015-05-08
    • 2015-07-05
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多