Criando Annotations de Validação! ConstraintValidator customizado

Como aproveitar o Bean Validation para que ele também verifique condições mais complexas acessando o banco de dados?

Usaremos o ConstraintValidator.

Criaremos uma @interface e um Validator (implementando ConstraintValidator):

Criar as duas no pacote service (subpacote Validation).

Annotation

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;

@Constraint(validatedBy = UserInsertValidator.class)
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)

public @interface UserInsertValid {
	String message() default "Validation error";

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

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

Validator

isValid - Testerá se o objeto UserInsertDTO será valido ou não (retorna boolean).

Initiliaze - Colocamos alguma lógica quando for inicializar o objeto, neste caso, ficará em branco.

Agora vamos ao UserInsertDTO e passamos o @UserInsertValid. Essa anotação por de baixo dos panos verificará se o email inserido já existe no banco.

Atualizado