@Email 어노테이션을 처리하는 EmailValidator 클래스는 AbstractEmailValidator 클래스를 상속받고 있습니다.
이 클래스는 ConstraintValidator 인터페이스를 구현하고 있습니다.
AbstractEmailValidator가 구현하고 있는 인터페이스의 타겟은
CharSequence 즉, 단일 대상에 한해서만 검증을 수행하고 있습니다.
따라서 이메일 검증을 수행해야할 대상이 다수일 경우,
이메일 폼 검증을 수행해야 하지만, @Email 어노테이션을 사용하지 못하는 문제가 발생합니다.
이럴 때에는 별도의 Validator 클래스를 생성하면 됩니다.
해당 Validator가 수행하는 역할은 Collection에 저장되어 있는 각 CharSequence에 대해
기존의 EmailValidator 클래스로 검증하는 것입니다.
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Validated(EmailCollectionValidator.class)
@Documented
public @interface EmailCollection {
String message() default "{javax.validation.constraints.Email.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class EmailCollectionValidator implements ConstraintValidator<EmailCollection, Collection<String>> {
@Override
public void initialize(EmailCollection constraintAnnotation) {
}
@Override
public boolean isValid(Collection<String> value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
EmailValidator validator = new EmailValidator();
for (String s : value) {
if (!validator.isValid(s, context)) {
return false;
}
}
return true;
}
}
실제 Validation Check를 수행해야 할 곳에는 다음과 같이 적용시키면 됩니다.
public class MailSenderRequest {
@Getter
@Setter
public static class Send {
@NotNull
@EmailCollection
private List<String> to;
private SubscriptionType subscriptionType;
}
}
'Java' 카테고리의 다른 글
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2024.07.07 |
---|