【发布时间】:2013-08-05 10:22:47
【问题描述】:
我在名为“com.travstar.validators”的包中的项目中创建了一个验证器,名为 EmailValidator。
课程内容:
package com.travstar.validators;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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;
@FacesValidator("emailValidator")
public class EmailValidator implements Validator
{
private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\." +
"[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*" +
"(\\.[A-Za-z]{2,})$";
private Pattern pattern;
private Matcher matcher;
public EmailValidator()
{
pattern = Pattern.compile(EMAIL_PATTERN);
}
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
{
matcher = pattern.matcher(value.toString());
if (!matcher.matches())
{
FacesMessage msg = new FacesMessage("Email validation failed.", "Invalid Email format.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
}
我实现了这样的电子邮件验证:
<h:panelGrid columns="1" width="100%">
<h:outputText value="Email Address"></h:outputText>
<h:inputText id="emailAddress" value="#{passengerDetailsBean.contactDetails.emailAddress}" styleClass="input-block-level" placeholder="" required="true">
<f:validator validatorId="emailValidator"></f:validator>
</h:inputText>
<h:message for="emailAddress" styleClass="alert alert-error" />
</h:panelGrid>
这或多或少与我在网上找到的教程完全一样,但我无法让它发挥作用。
点击页面的那一刻,抛出如下异常:
javax.servlet.ServletException: Unknown validator id 'emailValidator'
我使用的是 JSF 2.1,据我所知,我不需要摆弄 faces.config.xml
有人知道为什么会这样吗?
【问题讨论】:
-
为避免显而易见,您是否正确清理/重建/重新部署/重新启动项目和服务器?如果您已经使用注解,则无需在 faces-config.xml 中注册。在不相关的说明中,自 2010 年以来,域名中允许使用非拉丁字符,因此电子邮件地址中也允许使用非拉丁字符。因此,您的仅匹配拉丁字符的正则表达式模式被严重破坏。
-
@BalusC 谢谢 - 是的,我确实清理并重新部署了。正则表达式模式现在是一个简单的占位符 - 一旦我让它工作,我会在 regexlib.com 上寻找一个更宽容的:)
-
那我不知道。
ClassNotFoundException显然意味着该类不在类路径中。如果您没有打错任何字,这只能意味着项目没有正确构建/部署,或者您根本没有运行您认为正在运行的代码。深入服务器的部署文件夹并浏览是否在预期位置看到EmailValidator.class。异常表明它不存在。 -
@BalusC 我检查了。该文件似乎在正确的位置。我决定试试运气,只是将验证器标签弹出到 faces-config.xml 中,然后它就开始工作了。我很困惑我做错了什么,因为我非常确定我运行的是哪个版本的 JSF。我现在将结束这个问题。感谢您的帮助!
-
显然目标服务器正在积极缓存其部署/工作文件夹,并且没有立即注意到任何外部更改。你用的是哪一个?它有那种“开发”和“生产”的舞台设置吗?将其设置为开发。编辑:顺便说一句,你不需要在问题中喊出答案。只需以正常方式发布答案即可。
标签: validation jsf