0

根据<h:message for="" />JSF 对象,我有一个问题。我有一个 JSF 1.1(是的,不幸的是)myFaces 项目。我准备了一个带有标签、inputText 和消息持有者的简单 JSP 文件:

<h:form id="sacLinkForm">
    <cblFaces:outputLabel for="dedicatedCashAccountNumber"
        value="#{appBundle.KUSTA_DEDICATED_CASH_ACCOUNT_NUMBER}"/>
    <t:inputText id="dedicatedCashAccountNumber"
        value="#{createController.modelFE.sacLink.dedicatedCashAccountNumber}"/>
    <h:message id="dedicatedCashAccountNumberError"
        for="dedicatedCashAccountNumber" />
</h:form>

我还创建了简单的验证方法:

public static boolean validate(SACLink link) {
    boolean isError = false;
    FacesContext context = FacesContext.getCurrentInstance();
    FacesMessage message = new FacesMessage();
    message.setSeverity(FacesMessage.SEVERITY_ERROR);

    if (StringUtils.isEmpty(link.dedicatedCashAccountNumber)) {
        //MessageUtils.addErrorMessage("dedicatedCashAccountNumber", "Dedicated Cash Account Number is mandatory");
        message.setSummary("Field mandatory");
        message.setDetail("Dedicated Cash Account Number is mandatory");
        context.addMessage("sacLinkForm:dedicatedCashAccountNumber", message);
        isError = true;
    }
    return !isError;
}

我的问题是sacLinkForm:dedicatedCashAccountNumber因为编译的 JSP 生成了 id (fe _idJsp12:DynTab2:DynView2:tabK.....er:vKustaMa....Controller:sacLinkForm:dedicatedCashAccountNumber),它可能导致该方法与属性addMessage不对应。h:message for=".."

因此消息无法正确显示,因为 java 找不到正确的h:message对象。有什么方法可以h:message从 Java 将消息设置为正确的吗?我假设没有办法在 JSF 1.1 页面中强制“恒定”组件 ID。

谢谢你。

4

1 回答 1

4

您根本不应该在 JSF 操作方法中手动执行验证。您应该使用 JSF 内置的验证工具。您应该使用普通的 JSF Validator。您从中抛出的任何ValidatorException内容都将最终出现在正确的消息组件中。

validate()用以下类替换该方法:

public class AccountNumberValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (StringUtils.isEmpty(value)) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Field mandatory");
            message.setDetail("Dedicated Cash Account Number is mandatory");
            throw new ValidatorException(message);
        }
    }

}

注册faces-config.xml如下:

<validator>
     <validator-id>accountNumberValidator</validator-id>
     <validator-class>com.example.AccountNumberValidator</validator-class>
</validator>

在视图中使用如下:

<t:inputText id="dedicatedCashAccountNumber"
    value="#{createController.modelFE.sacLink.dedicatedCashAccountNumber}"
    validator="accountNumberValidator" />

而已。请注意,如果验证(或转换)失败,则不会调用 JSF 操作方法。也不需要无意义的isError混乱。

于 2013-03-13T18:44:12.237 回答