JSF Ajax 仅调用了第 1 次

JSF Ajax called only 1st time

在 JSF2 中,我有一个像这样的 XHTML:

<h:form id="myForm">
...
    <c:forEach items="#{myController.header}" var="hd" varStatus="count">
         #{hd}
         <h:selectOneMenu value="#{myController.type[count.index]}" id="formtype" >
                 <f:selectItem itemValue="Nop" itemLabel="Nop" />
                 <f:selectItem itemValue="Yep" itemLabel="Yep" />
                 <f:ajax render="@form" />
          </h:selectOneMenu>
          #{myController.type[count.index]}
          <h:selectBooleanCheckbox value="#myController.valid[count.index]}" id="valid">
                 <f:ajax render="@form"/>
          </h:selectBooleanCheckbox> 
          #{myController.valid[count.index]}
     </c:forEach>
...
</h:form>

我的托管 bean 有:

private String[] type;
private boolean[] valid;

我在第一次加载命名 bean 时初始化(type = new String[...]; 并为每个位置分配一个值)。

如果我修改组合或复选框,它起作用,托管 bean 中的值会更改,新值会在 JSF 页面中打印(呈现)。但是只是第一次。接下来的更改根本不会修改任何内容。这很奇怪,因为我在其他应用程序中有类似的代码并且工作正常,所以我做错了但找不到它。我的模板有一个 h:header 并且我在 JS 控制台或 TomEE 中看不到任何日志(我只看到 .INFO - The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myApp]] after start() had already been called. The second call will be ignored 但我认为它是不相关的)。我尝试添加 execute="@this"/execute="@form" 和其他人,但没有成功,并检查了 this post 的所有要点,但似乎没有任何内容适用于我。

我没有看到什么错误?


编辑

@Named(value = "myController")
@ViewScoped
public class MyController implements Serializable {
...

我的模板中也有一个 <h:messages globalOnly="true" showDetail="true" showSummary="true" />

我想我终于明白了!

感谢两件事:

  1. BalusC answer 中的第 3 点。我在模板 <h:messages id="msg" 中为我的消息添加了一个 id,然后使用 <f:ajax render="@form msg"....。这导致出现错误 j_idt1: Validation Error: Value is required

  2. 然后我可以在this post中找到解决方案:将所需参数从true更改为<f:viewParam required="#{!facesContext.postback}"。这在我的其他应用程序中不是必需的,因为必需的是 "false",因为它可以使用参数或不使用它来调用。当使用参数调用它时,它起作用了,因为偶然发现页面可以在没有它的情况下调用。

运行 遇到完全相同的问题,我的 <f:ajax> 标记第一次可以工作,然后什么都没有...页面上没有错误或任何内容。几个小时后,经过无数次谷歌搜索,什么也没有出现。 (Whosebug 上的大多数问题实际上都有相反的问题,Ajax 第一次不会触发,但之后它会正常工作)。我终于偶然发现了这个问题,它准确地描述了我所看到的。

我之前只尝试重新呈现页面的一部分,但我注意到一旦我将 render 属性更改为 "@all",我就会收到与上述相同的错误消息:

j_idt1: Validation Error: Value is required

我向上滚动并注意到我有一个 <f:viewParam>,要求设置为 "true"。我进行了 user1156544 描述的更改并且成功了。