Richfaces rich:a4j事件后未显示消息

Richfaces rich:a4j事件后未显示消息,richfaces,seam,ajax4jsf,Richfaces,Seam,Ajax4jsf,我的Seam项目中有以下xhtml代码: <rich:column style="text-align:right"> <h:inputText id="txtPercReqAmount" maxlength="6" style="width:75px;text-align:right;" value="#{pib.reservedPercentage}"> <a4j:support event="onchange" ajaxSingle="

我的Seam项目中有以下xhtml代码:

<rich:column style="text-align:right">
    <h:inputText id="txtPercReqAmount" maxlength="6" style="width:75px;text-align:right;" value="#{pib.reservedPercentage}">
        <a4j:support event="onchange" ajaxSingle="true" action="#{requestForm.onReservedPercentageChange(pib)}" reRender="txtReqAmount,txtBudget,msgPercReqAmount"/>
    </h:inputText>
</rich:column>
<rich:column width="250px" style="text-align:left">
    <rich:message id="msgPercReqAmount" for="txtPercReqAmount" styleClass="messagesingle" errorClass="errormsg" infoClass="infomsg" warnClass="warnmsg">
        <f:facet name="errorMarker"><h:graphicImage url="/img/msgerror.png"/></f:facet>
    </rich:message>
</rich:column>

我在inputText的“onchange”事件中进行了一些验证。如果验证失败,我想在
列中写入错误消息。 下面是我的backingbean事件的java代码:

public void onReservedPercentageChange(ProcessInstanceBudget pib) {
    BigDecimal arg2 = pib.getReservedPercentage();
    BigDecimal ra;
    try
    {
        if (arg2 instanceof BigDecimal)
            ra = (BigDecimal) arg2;
        else
            ra = BigDecimal.ZERO;
    }
    catch (ClassCastException cce)
    {
        facesMessages.add(Severity.ERROR, "The allocation request isn't valid!");
        return;
    }

    if (ra.compareTo(BigDecimal.ZERO) < 0 || ra.compareTo(new BigDecimal(100.0)) > 0) {
        facesMessages.add(Severity.ERROR, "Allocation percentage must be in the range between 0 and 100!");
        return;
    }

    updateBudgetAllocation(pib);
}
在ReservedPercentageChange(ProcessInstanceBudget pib)上公共作废{
BigDecimal arg2=pib.getReservedPercentage();
比格拉;
尝试
{
if(arg2实例为BigDecimal)
ra=(BigDecimal)arg2;
其他的
ra=BigDecimal.0;
}
捕获(ClassCastException cce)
{
facesMessages.add(Severity.ERROR,“分配请求无效!”);
返回;
}
如果(ra.compareTo(BigDecimal.ZERO)<0 | | ra.compareTo(新的BigDecimal(100.0))>0){
添加(Severity.ERROR,“分配百分比必须在0到100之间!”;
返回;
}
更新预算分配(pib);
}
问题是没有显示错误消息(我没有收到类似“FacesMessage已排队,但可能未显示”之类的警告)。

我不知道我的代码有什么问题。有人能帮忙吗?

您将消息添加为全局错误,但没有任何元素显示它

您需要的不是将其添加为全局错误消息,而是将其附加到导致错误的输入组件

您可以这样做:

FacesContext.getCurrentInstance().addMessage(clientId,
            new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
这里的重要部分是UIComponent的给定clientId。如果您有此组件(例如通过绑定),则可以通过UIComponent.getClientId()获得它。(见附件)

如果您没有对组件的引用,那么您唯一的机会就是分析整个组件树,并通过您在facelet文件(.xhtml)中提供的id=“…”来搜索它。(请参阅)

尝试添加一个或甚至不添加globalOnly属性(以显示所有未显示的消息),并检查它是否仍然丢失。使用
时,它会显示。但是我需要显示特定于输入的消息,所以我想修改代码,以便使用