【问题标题】:JSF Validator not found未找到 JSF 验证器
【发布时间】: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


【解决方案1】:

显然,目标服务器正在积极缓存其部署/工作文件夹,并没有立即注意到任何外部更改。你用的是哪一个?它有那种“开发”和“生产”的舞台设置吗?将其设置为开发。

【讨论】:

  • 它已设置为生产 - 我将其设置为 dev,现在可以正常工作了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 2013-07-25
  • 1970-01-01
  • 2011-09-04
  • 2011-04-28
  • 2018-01-28
  • 2013-01-23
相关资源
最近更新 更多