/Registration.xhtml @ 19,81validator =“#{UsernameValidator}":标识"UsernameValidator"为空,无法调用 [英] /Registration.xhtml @19,81 validator="#{UsernameValidator}": Identity 'UsernameValidator' was null and was unable to invoke

查看:208
本文介绍了/Registration.xhtml @ 19,81validator =“#{UsernameValidator}":标识"UsernameValidator"为空,无法调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的项目结构:

这在我的XHTML文件中:

This is in my XHTML file:

<h:inputText id="username" value="#{user.username}" required="true"
 validator="#{UsernameValidator}" />
 <h:message for="username"/>

这是UsernameValidator类:

@FacesValidator("UsernameValidator")
public class UsernameValidator implements Validator {

    @Override
    public void validate(FacesContext fc, UIComponent uic, Object value) throws ValidatorException {
        JOptionPane.showMessageDialog(null, "in validator class");
        if (String.valueOf(value).length() == 0 || String.valueOf(value).length() < 3) {
            FacesMessage message = new FacesMessage("Username Validation Failed", "Invalid Username");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
        }
    }
}

但是当我在username字段中写东西时,会发生此错误:

But when I write something in username field, This error happens:

/Registration.xhtml @ 19,81validator =#{UsernameValidator}":身份'UsernameValidator'为空,无法调用

/Registration.xhtml @19,81 validator="#{UsernameValidator}": Identity 'UsernameValidator' was null and was unable to invoke

推荐答案

您的错误在这里:

<h:inputText ... validator="#{UsernameValidator}" />

您正在尝试将@FacesValidator引用为托管bean.这行不通. @FacesValidator批注中的值表示应在应用程序范围内使用的验证者ID,该ID将指定为字符串,而不是托管Bean名称.

You're trying to reference a @FacesValidator as a managed bean. This won't work. The value in the @FacesValidator annotation represents the application-wide validator ID which is to be specified as a string, not a managed bean name.

所以,下面应该做:

<h:inputText ... validator="UsernameValidator" />

是的,您可能已经看过代码片段,其中通过#{...}将验证器(或转换器)引用为托管Bean.但是在这种情况下,它们实际上也是通过@ManagedBean@Named而不是@FacesValidator(或@FacesConverter)注册为托管bean的.

True, you'll probably have seen code snippets wherein a validator (or converter) is referenced as a managed bean via #{...}. But in those cases they are actually also registered as a managed bean via @ManagedBean or @Named instead of @FacesValidator (or @FacesConverter).

@ManagedBean
@RequestScoped
public class UsernameValidator implements Validator {}

通常这样做是为了能够将EJB注入到其中,以便可以执行任何必要的业务/数据库逻辑.

This is often done so in order to be able to inject an EJB into it so that any necessary business/DB logic could be performed.

无关与具体问题:以下

JOptionPane.showMessageDialog(null, "in validator class");

网络应用程序中执行记录"的一种非常非常错误的方法.请停止这样做.

Is a very, very bad way to perform "logging" in a web application. Please stop doing that.

这篇关于/Registration.xhtml @ 19,81validator =“#{UsernameValidator}":标识"UsernameValidator"为空,无法调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆