Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

JSF não chama Validador Customizado beanValidator

Olá, implementei um validador customizado com BeanValidator, mas no momento de executar a action ele ignora completamente a existência deste validador. Oque tem de errado nesse código?


public class PasswordMatchValidator implements ConstraintValidator<PasswordMatch, Object>{

    private String atributo;
    private String atributoConfirmacao;

    @Override
    public void initialize(PasswordMatch constraintAnnotation) {

        this.atributo = constraintAnnotation.atributo();
        this.atributoConfirmacao = constraintAnnotation.atributoConfirmacao();    
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext context) {
        boolean valido = false;
        try {
            Object valorAtributo = BeanUtils.getProperty(object, this.atributo);
            Object valorAtributoConfirmacao = BeanUtils.getProperty(object, this.atributoConfirmacao);
            valido = ambosSaoNull(valorAtributo, valorAtributoConfirmacao) || ambosSaoIguais(valorAtributo, valorAtributoConfirmacao);

        } catch (Exception e) {
            throw new RuntimeException("Erro recuperando valores dos atributos", e);
        }

        if (!valido) {
            context.disableDefaultConstraintViolation();
            String mensagem = context.getDefaultConstraintMessageTemplate();
            ConstraintViolationBuilder violationBuilder = context.buildConstraintViolationWithTemplate(mensagem);
            violationBuilder.addPropertyNode(atributoConfirmacao).addConstraintViolation();
        }

        return valido;
    }



    private boolean ambosSaoIguais(Object valorAtributo, Object valorAtributoConfirmacao) {
        return valorAtributo != null && valorAtributo.equals(valorAtributoConfirmacao);
    }

    private boolean ambosSaoNull(Object valorAtributo, Object valorAtributoConfirmacao) {
        return valorAtributo == null && valorAtributoConfirmacao == null;
    }

}
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { PasswordMatchValidator.class })
public @interface PasswordMatch {

    @OverridesAttribute(constraint = Pattern.class, name = "message")
    String message() default "As senhas não conferem";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    String atributo();

    String atributoConfirmacao();

}
@AtributoConfirmacao(atributo = "senha", atributoConfirmacao = "confirmacaoSenha", message = "Confirmação da senha não confere")
@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

//continua

}

Esse validador nunca é chamado

2 respostas
solução

Oi Ricardo,

Infelizmente o JSF ainda não suporta validadores a nível de Classe.

Como sua anotação de validação não é colocada em um atributo, mas sim na classe, o JSF ignora esse validador =/

O jeito é chamar manualmente o seu validador.

Bons estudos!

trágico, trágico, bom mas oque não tem remédio remediado está. Obrigado!