在我的网络应用程序中,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请求似乎启动,成功,完成事件序列被调用(无错误),正确呈现要呈现的组件但不触发操作。 有没有办法调试这种情况,找出问题的根本原因是什么?
答案 0 :(得分: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>
未通过所需的验证。
有几种解决方案:
在命令组件中保留<f:param>
后续请求的请求参数。
<h:commandLink ...>
...
<f:param name="id" value="#{param.id}" />
</h:commandLink>
仅在非回发期间使其成为必需。仅当页面最初由GET请求打开时,此方法才有效。但是,如果它通过非重定向导航打开,那么它仍然会失败。
<f:viewParam ... required="#{not facesContext.postback}" />
将<f:viewParam>
替换为JSF实用程序库OmniFaces <o:viewParam>
提供的required="true"
。它会在回发时隐式关闭<o:viewParam ... required="true" />
,以便您继续使用相同的属性。
{{1}}