我有一个 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/>
。
我希望只显示一条错误消息。
我该如何修复它,以便只显示一条全局消息?
为了避免在使用多个 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" />