JSF2.0,消息不显示在数据表中

JSF2.0,消息不显示在数据表中,jsf,datatable,message,Jsf,Datatable,Message,我有一个带有dataTable的表单,它有多个具有链接和OutputExt的列。有一个输入字段通过ajax请求进行评估。自定义验证器确保只向字段添加整数。表格如下 <form> <h:dataTable var="item" value="#{listItems.model}" id="adminlistItems"> //other columns having commandLinks and ou

我有一个带有dataTable的表单,它有多个具有链接和OutputExt的列。有一个输入字段通过ajax请求进行评估。自定义验证器确保只向字段添加整数。表格如下

    <form>  
            <h:dataTable var="item" value="#{listItems.model}" id="adminlistItems"> 
                //other columns having commandLinks and outputTexts
                    <h:column>
                        <f:facet name="header" >
                            <h:outputText value="Quantity"/>
                        </f:facet>                  
                        <f:ajax listener="#{listItems.AddQuantityAction}">
                            <div style="padding:5px;float:left">
                                <h:inputText label="changeQuantity" id="addquantity" value="#{item.additionalQuantity}" maxlength="4" size="3">
                                    <f:validator validatorId="integerValidator"/>
                                </h:inputText>
                                <h:outputText value="&nbsp;"/>
                                <h:commandButton value="AddQuantity"  />
                                <h:message for="addquantity"/>
                            </div>
                        </f:ajax>  
                    </h:column>
            </h:dataTable>
        </h:form>

自定义验证器引发未显示的验证器异常。监听器也有代码用于未显示的消息。我读过几个类似的问题,这听起来也是一个常见的问题。但是,即使我遗漏了一些明显的东西,我也需要第三只眼睛来查看我没有看到的东西。
执行
渲染
默认为
@this
。因此,将只处理和刷新当前活动的组件。按下按钮时,不会发送输入值,也不会刷新消息组件

相应地进行修正:

<f:ajax execute="addquantity" render="addquantity_message" listener="#{listItems.AddQuantityAction}">
    ...
    <h:message id="addquantity_message" for="addquantity"/>
    ...
</f:ajax>
此外,ajax侦听器方法的返回值应该是
void
。不管怎样,它都被完全忽略了。此外,方法名称应以小写字母开头。另见


更新根据评论,这在验证方面似乎效果不好。侦听器被调用两次,因为实际上发送了两个ajax请求,一个用于输入,一个用于命令。我建议将侦听器方法移动到


...

您将只将获得的客户端ID固定为输入ID,而不是按钮ID。

当我添加代码时,消息只会闪烁并熄灭。它不会留在页面中。验证消息现在可以了。它们在将
侦听器更改为
操作后出现并保留,但是动作方法中my
FacesMessage
中的消息仍然没有显示。
UIComponent#getCurrentComponent()
将是命令按钮组件,而不是输入组件。我建议创建另一个指向按钮组件ID的
。满脸笑容:)也感谢您的其他输入和建议。我没有使用,因为我不知道如何限制输入负数
<f:ajax execute="addquantity" render="addquantity_message" listener="#{listItems.AddQuantityAction}">
    ...
    <h:message id="addquantity_message" for="addquantity"/>
    ...
</f:ajax>
<h:inputText ... converter="javax.faces.Integer">
<f:ajax execute="addquantity" render="addquantity_message">
    ...
    <h:commandButton action="#{listItems.AddQuantityAction}" />
    <h:message id="addquantity_message" for="addquantity"/>
</f:ajax>