SpringBootでフォームからPOSTされた際の独自Validator
SpringBootで構築しているWebアプリで、アカウント登録時にメールアドレスの重複チェック(既に登録されていないか)が必要なのですが、フォームからPOSTされた内容を検証するためにValidatorを作ったので、実装したことをここに残しておきます。
アノテーションの作成
SpringBootでValidatorを使う場合、Formのクラスのフィールドにアノテーションを付けます。 組み込みのValidatorとして@NotNullや@Sizeや@Patternといったアノテーションがあるのですが、今回はメアド重複チェック用のアノテーションを自作します。
@Documented @Constraint(validatedBy = {UnusedMailAddressValidator.class}) @Target({FIELD}) @Retention(RUNTIME) public @interface UnusedMailAddress { String message() default "このメールアドレスは既に登録されています"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; @Target({FIELD}) @Retention(RUNTIME) @Documented public @interface List { UnusedMailAddress[] value(); } }
項目としては雛形に沿ったオマジナイ的なものですが、内容は以下のサイトを参考にしました。
ロジック本体の作成
これ自体は、大したことはありません。
public class UnusedMailAddressValidator implements ConstraintValidator<UnusedMailAddress, String> { @Autowired UserDao userDao; @Override public void initialize(UnusedMailAddress constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { User user = userDao.findByMailAddress(value); if(user!=null) { return false; } return true; }
実装
あとは、実際にValidationしたいBeanのフィールドに
// メールアドレス @NotNull(message = "メールアドレス") @Pattern(regexp = "[\\w\\-._]+@[\\w\\-._]+\\.[A-Za-z]+", message = "正しい形式で入力して下さい") @UnusedMailAddress private String mailAddress;
とアノテーションをつければOKです。
入力値チェックはどこで実装するのが良いのか、色々と考えられますが、Validatorに集約すればコードの見通しが良くなるのではと思います。
以上です。