Я хотел бы иметь пользовательскую аннотацию, чтобы проверить, является ли электронное письмо в форме уникальным или нет. Aldready успешно создал аннотацию «ValidEmail».Пользовательская проверка
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidatorImpl.class)
public @interface ValidEmail {
String message() default "{error.validEmail}";
String[] groups() default {};
}
класс реализации:
public class EmailValidatorImpl implements ConstraintValidator<ValidEmail, String> {
private static String EMAIL_PATTERN = "^[\\w\\.-][email protected]([\\w\\-]+\\.)+[A-Z]{2,4}$";
private Pattern pattern;
private Matcher matcher;
@Override
public void initialize(ValidEmail annotation) {
pattern = Pattern.compile(EMAIL_PATTERN, Pattern.CASE_INSENSITIVE);
}
@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
return isValidEmail(email);
}
private boolean isValidEmail(String email) {
CharSequence emailstr = email;
matcher = pattern.matcher(emailstr);
return matcher.matches();
}
}
Я хотел бы теперь, чтобы построить "uniqueEmail" аннотацию.
public class UniqueEmailValidatorImpl implements ConstraintValidator<UniqueEmail, String> {
private UserServices userServices;
@Override
public void initialize(UniqueEmail annotation) {
this.userServices = annotation.getUserServices();
}
@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
return isUniqueEmail(email);
}
private boolean isUniqueEmail(String email) {
try {
userServices.findByEmail(email);
} catch (UserDoesNotExistException e) {
return true;
}
return false;
}
}
Поскольку я следую IoC (с весны), я действительно не люблю создания экземпляра слоя обслуживания пользователя непосредственно в методе инициализации. Как бы вы предложили решить эту проблему? Может ли аннотация ссылаться на экземпляр?
@Override
public void initialize(UniqueEmail annotation) {
this.userServices = annotation.getUserServices();
}
Любые предложения будут оценены. Спасибо!
Хм, есть уже неплохой API для проверки электронной почты (javamail), почему бы вам не использовать его? – fge
Вы правы, но мне нужно проверить мою базу данных, если письмо существует. «ValidEmail» должен был только попробовать это. – Apokai