0

我的 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”事件中进行了一些验证。如果验证失败,我想在<rich:message>列中写入错误消息。这是我的支持 bean 事件的 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);
}

问题是未显示错误消息(我没有收到“FacesMessage(s) 已入队,但可能未显示”之类的警告)。
我无法弄清楚我的代码有什么问题。有人可以帮忙吗?

4

1 回答 1

0

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

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

你可以这样做:

FacesContext.getCurrentInstance().addMessage(clientId,
            new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));

这里重要的部分是 UIComponent 的给定 clientId。如果你有这个组件(例如通过绑定),你可以通过 UIComponent.getClientId() 获取它。(请参阅在 JSF 2.0 中检索其他组件的客户端 ID)。

如果您没有对组件的引用,您唯一的机会是分析整个组件树并通过您在 facelet 文件 (.xhtml) 中提供的 id="..." 的 id 搜索它。(请参阅计算 UIComponent clientID 的有效方法?

于 2013-08-20T08:48:09.927 回答