在我的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批注并在Service中手动触发它。有可能吗?