在同一输入字段使用多个 JSF 验证器时如何避免多个 Primefaces 错误消息

问题描述 投票:0回答:1

我有一个 Primefaces

p:inputText
组件和 2 个 JSF 验证器。第一个检查 RegEx,第二个检查输入字段的最小和最大长度。

如果验证与两个验证器都不匹配,那么我会在全局消息中显示相同的验证器消息两次。

这是我的组件:

<p:messages id="globalMsg" />

...
<p:inputText id="raRegEmail" 
                value="#{bean.emailAdres}"
                required="true"
                validatorMessage="#{i18nMsg['invalid_email']}"
                styleClass="w-full">
    <f:validateRegex pattern="#{bean.getRegEx('email')}" />
    <f:validateLength minimum="6" maximum="200"/>
</p:inputText>
<p:message id="raRegEmailMsg" for="raRegEmail" />

例如,电子邮件地址为“7777”,两个

f:validateXXX
都会失败,但组件中只有一个可能的
validatorMessage
,在全局消息中显示两次
<p:messages/>

Errormessages after validation

我希望只显示一条错误消息。

我该如何修复它,以便只显示一条全局消息?

validation jsf primefaces error-messaging
1个回答
0
投票

为了避免在使用多个 JSF 验证器时为单个输入字段显示多个错误消息,您可以使用自定义验证器。自定义验证器允许您控制验证过程和显示的错误消息。

以下是如何创建自定义验证器的示例:

@FacesValidator("customEmailValidator")
public class CustomEmailValidator implements Validator {

   @Override
   public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
       String email = value.toString();

       // Check if email is empty
       if (email.isEmpty()) {
           throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email is required", null));
       }

       // Check if email matches the regex pattern
       if (!email.matches(bean.getRegEx('email'))) {
           throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid email format", null));
       }

       // Check if email length is between 6 and 200
       if (email.length() < 6 || email.length() > 200) {
           throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email length should be between 6 and 200 characters", null));
       }
   }
}

现在,您可以在 JSF 组件中使用这个自定义验证器,如下所示:

<p:inputText id="raRegEmail" 
               value="#{bean.emailAdres}"
               required="true"
               validatorMessage="#{i18nMsg['invalid_email']}"
               styleClass="w-full">
   <f:validator validatorId="customEmailValidator" />
</p:inputText>
<p:message id="raRegEmailMsg" for="raRegEmail" />
© www.soinside.com 2019 - 2024. All rights reserved.