В моем проекте API у меня есть пользовательский ConstraintValidator, чтобы проверить, не связаны ли адреса электронной почты с другой учетной записью.
Интерфейс:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = EmailUniqueConstraintValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EmailUnique {
String message() default "cannot already be associated with another account";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Валидатор:
import com.demo.demoapp.repo.UserRepository;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailUniqueConstraintValidator implements ConstraintValidator<EmailUnique, String> {
private UserRepository userRepository;
public EmailUniqueConstraintValidator(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value == null || !userRepository.existsByEmail(value);
}
}
Этот валидатор добавляется в объект запроса на создание пользователя и корректно проверит наличие адреса электронной почты и вернет ошибку BindingResult, если это так.
Но когдаредактирование пользователя, все становится сложнее.Пользовательский объект должен быть полностью передан в API, за исключением объекта, поэтому этот валидатор ограничения всегда будет срабатывать.Поэтому я хотел бы удалить аннотацию @EmailUnique из класса и вручную запустить ее в Сервисе.Это возможно?