/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.