EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

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に集約すればコードの見通しが良くなるのではと思います。

以上です。