Esta es mi estructura de proyecto:

enter image description here

Esto está en mi archivo XHTML:

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

Y aquí está la clase 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);
        }
    }
}

Pero cuando escribo algo en el campo username, ocurre este error:

/Registration.xhtml @ 19,81 validator = "# {UsernameValidator}": la identidad 'UsernameValidator' era nula y no se pudo invocar

0
user4279433 17 feb. 2015 a las 01:42

2 respuestas

La mejor respuesta

Tu error está aquí:

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

Está intentando hacer referencia a un @FacesValidator como un bean administrado. Esto no funcionará. El valor de la anotación @FacesValidator representa el ID del validador de toda la aplicación que se debe especificar como una cadena, no como un nombre de bean administrado.

Entonces, a continuación debería hacer:

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

Es cierto que probablemente haya visto fragmentos de código en los que se hace referencia a un validador (o convertidor) como un bean administrado a través de #{...}. Pero en esos casos, en realidad también se registran como bean administrado a través de @ManagedBean o @Named en lugar de @FacesValidator (o @FacesConverter).

@ManagedBean
@RequestScoped
public class UsernameValidator implements Validator {}

Esto a menudo se hace para poder inyectar un EJB en él para que se pueda realizar cualquier lógica empresarial / DB necesaria.

Véase también:


No relacionado con el problema concreto: el siguiente

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

Es una forma muy, muy mala de realizar "registros" en una aplicación web . Por favor deja de hacer eso.

2
Community 20 jun. 2020 a las 09:12

Parece haber un problema en su archivo Registration.xhtml. El validador requiere una etiqueta separada dentro de la etiqueta :

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

<h:message for="username" />

El error que tiene parece deberse a que JSF no puede encontrar el bean de validación. El directorio de su proyecto se ve bien, pero verifique que el archivo de clase para UsernameValidator esté allí y pueda ser leído por su servidor de aplicaciones.

0
Tim Biegeleisen 17 feb. 2015 a las 00:00