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

How to avoid multiple Primefaces error messages when using multiple JSF validators at the same input field

提问人:kik 提问时间:11/17/2023 最后编辑:kik 更新时间:11/17/2023 访问量:22

问:

我有一个带有 2 个 JSF 验证器的 Primefaces 组件。第一个检查正则表达式,第二个检查输入字段的最小和最大长度。p:inputText

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

这是我的组件:

<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:validateXXXvalidatorMessage<p:messages/>

验证后的错误消息

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

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

验证 JSF Primefaces 错误消息

评论

0赞 Nikola 11/18/2023
PrimeFaces globalOnly=“true” 有什么帮助吗?
0赞 JoseJC 11/24/2023
相关 stackoverflow.com/questions/30910311/...

答:

0赞 JoseJC 11/23/2023 #1

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

下面是如何创建自定义验证程序的示例:

@FacesValidator("customEmailValidator")
public class CustomEmailValidator implements Validator {
private final String EMAIL_PATTERN = "^[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*@[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*$";

   @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(EMAIL_PATTERN)) {
           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" />