如何避免单个Primefaces输入框多JSF验证器重复显示全局错误消息
解决PrimeFaces输入框多验证器触发时全局消息重复的问题
当同一个输入组件绑定多个JSF验证器,且组件统一设置了validatorMessage时,每个验证器失败都会生成一条相同内容的错误消息,导致全局<p:messages>重复显示。以下是几种实用解决思路:
方法1:合并验证逻辑为单个自定义验证器
将长度校验和正则校验的逻辑整合到一个自定义验证器中,无论哪条规则不满足,仅抛出一次验证异常,生成单条错误消息。
步骤1:实现自定义验证器
import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.FacesValidator; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; import java.util.regex.Pattern; @FacesValidator("emailValidator") public class EmailValidator implements Validator { @Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { String email = (String) value; String invalidEmailMsg = context.getApplication() .getResourceBundle(context, "i18nMsg") .getString("invalid_email"); // 校验长度规则 if (email.length() < 6 || email.length() > 200) { throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, invalidEmailMsg, null)); } // 校验正则规则 String regexPattern = (String) component.getAttributes().get("pattern"); if (!Pattern.compile(regexPattern).matcher(email).matches()) { throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, invalidEmailMsg, null)); } } }
步骤2:修改页面组件
替换原有的两个验证器,使用自定义验证器:
<p:messages id="globalMsg" /> ... <p:inputText id="raRegEmail" value="#{bean.emailAdres}" required="true" styleClass="w-full"> <f:validator validatorId="emailValidator" /> <f:attribute name="pattern" value="#{bean.getRegEx('email')}" /> </p:inputText> <p:message id="raRegEmailMsg" for="raRegEmail" />
方法2:让全局消息仅显示真正的全局消息
给全局<p:messages>添加globalOnly="true"属性,使其只显示未绑定到具体组件的全局消息(即通过FacesContext.addMessage(null, ...)添加的消息),组件级错误仅在对应的<p:message>中显示:
<p:messages id="globalMsg" globalOnly="true" />
此时<p:message>会默认展示该组件的最后一条验证错误,不会出现重复。
方法3:为每个验证器设置独立消息(备选)
如果允许展示不同的错误提示,可以给每个验证器单独配置validatorMessage,避免消息重复:
<p:inputText id="raRegEmail" value="#{bean.emailAdres}" required="true" styleClass="w-full"> <f:validateRegex pattern="#{bean.getRegEx('email')}" validatorMessage="#{i18nMsg['invalid_email_format']}" /> <f:validateLength minimum="6" maximum="200" validatorMessage="#{i18nMsg['invalid_email_length']}" /> </p:inputText>
内容的提问来源于stack exchange,提问作者kik
相关产品推荐
相关产品推荐

