概要
Spring MVCにてフォームの入力チェックを行う方法についてまとめた。
前回作成した相関チェックについて、1つのフォーム内で複数回使用する方法について紹介する。
前提
前回の記事の続きとなる。
概要 Spring MVCにてフォームの入力チェックを行う方法についてまとめた。 今回は相関チェックルールを作成する方法について紹介する。 前提 入力チェックに必要な情報は以下となる。
相関チェックアノテーションを複数回使用する
相関チェックアノテーションを1つのフォーム内で複数回使用する方法について紹介する。
現状の問題点
Javaは基本的に同じアノテーションを1つのクラスに複数回使用できない。
例えば以下のように、作成した相関チェックアノテーションを複数回クラスに使用した場合はエラーになってしまう。
FooForm.java
@FieldsMatch(property = "password", comparingProperty = "confirmPassword")
@FieldsMatch(property = "email", comparingProperty = "confirmEmail")
public class FooForm implements Serializable {
リピート可能アノテーション
相関チェックのアノテーションを複数回使用できるようにするため、リピート可能アノテーションを定義する。
FieldsMatchList.java
package com.example.prototype.web.common.validation;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface FieldsMatchContainer {
FieldsMatch[] value(); // ①
}
上記のように複数回使用したい相関チェックアノテーションクラスを定義するだけ。
リピート機能ON
もとの相関チェックアノテーションクラスを修正する。
FieldsMatch.java
(略)
@Documented
@Constraint(validatedBy = { FieldsMatchValidator.class })
@Retention(RUNTIME)
@Target({ TYPE, ANNOTATION_TYPE })
@Repeatable(FieldsMatchContainer.class) // ①
public @interface FieldsMatch {
(略)
}
上記により、@FieldsMatch アノテーションを同一のクラスに複数回使用することができるようになる。
使用例
パスワードの相関チェックに加えて、メールアドレスの相関チェックも同様に行う。
※メールアドレスの形式等は考慮しないこととする
フォーム
相関チェックアノテーションをクラスに追加する。
FooForm.java
@Data
@FieldsMatch(property = "password", comparingProperty = "confirmPassword")
@FieldsMatch(property = "email", comparingProperty = "confirmEmail")
public class FooForm implements Serializable {
// フォーム部品を追加していく
// パスワード
@Alphanumeric
private String password;
// 確認用パスワード
private String confirmPassword;
// メールアドレス
private String email;
// メールアドレス(確認用)
private String confirmEmail;
}
メッセージプロパティ
メッセージプロパティファイルに、メールアドレスの表示内容を定義する。
messages_ja.properties
fooForm.password=パスワード
confirmPassword=パスワード(確認用)
fooForm.email=メールアドレス
confirmEmail=メールアドレス(確認用)
FieldsMatch.default.message={0}と{1}の値が一致しません。
画面
メールアドレスの入力項目、エラーメッセージ表示領域等を追加する。
input.jsp
<tr>
<th class="col-3">パスワード</th>
<td class="col-7">
<form:password path="password" cssClass="form-control" />
<form:errors path="password" cssClass="text-danger" />
</td>
</tr>
<tr>
<th class="col-3">パスワード(確認用)</th>
<td class="col-7">
<form:password path="confirmPassword" cssClass="form-control" />
<form:errors path="confirmPassword" cssClass="text-danger" />
</td>
</tr>
<tr>
<th class="col-3">メールアドレス</th>
<td class="col-7">
<form:input path="email" cssClass="form-control" />
<form:errors path="email" cssClass="text-danger" />
</td>
</tr>
<tr>
<th class="col-3">メールアドレス(確認用)</th>
<td class="col-7">
<form:input path="confirmEmail" cssClass="form-control" />
<form:errors path="confirmEmail" cssClass="text-danger" />
</td>
</tr>
実行結果
実行結果は以下となる。