#17 Spring バリデーションの実行順序の変更
前回は自分で設定したエラーメッセージが表示されるよう設定しました。
しかし、それだけでは不要なエラーメッセージも同時に表示されてしまうので、今回はエラーメッセージの表示順を設定します。
前提条件
この記事はSpringの最低限の知識が必要になります。
また、なるべく分かりやすく書くつもりですが、この記事の目的は自分の勉強のアウトプットであるため所々説明は省略します。
前回まで
前回の記事は以下になります。
構築環境
成果物
今回行うこと
今回は以下の流れに沿って進めていきます。
- GroupOrder.java, ValidGroup1.java, ValidGroup2.javaの作成
- GroupOrder.javaに内容を記述
- SignupForm.javaに内容を追加
- SignupController.javaに内容を追加
1. GroupOrder.java, ValidGroup1.java, ValidGroup2.javaの作成
src/main/java/com/example/form
の直下に、GroupOrder.java
, ValidGroup1.java
, ValidGroup2.java
の3ファイルを作成します。
この3つのファイルは全てインターフェースです。
2. GroupOrder.javaに内容を記述
次にGroupOrder.java
内に先ほど追加したValidGroup1.java
, ValidGroup2.java
の2つのファイルを定義していきます。
package com.example.form;
import javax.validation.GroupSequence;
@GroupSequence({ ValidGroup1.class, ValidGroup2.class })
public interface GroupOrder {
}
ここでは@GroupSequence({ ValidGroup1.class, ValidGroup2.class })
をクラスに付与します。
@GroupSequence
アノテーションはバリデーションの順番を設定することができます。
左から設定されたインターフェースの順番でバリデーションを行います。
3. SignupForm.javaに内容を追加
Formクラスのバリデーションと先ほど登録したバリデーションの順番を紐付けて行きます。
// 省略
@Data
public class SignupForm {
@NotBlank(groups = ValidGroup1.class)
@Email(groups = ValidGroup2.class)
private String userId;
private Integer phoneNumber;
private Integer postal1;
private Integer postal2;
private String address;
@NotBlank(groups = ValidGroup1.class)
private String userName;
@NotBlank(groups = ValidGroup1.class)
@Pattern(regexp="^(?=.*[A-Z])[a-zA-Z0-9_]+$", groups = ValidGroup2.class) // 少なくとも大文字が1つ含まれる
@Length(min=8, max=24 , groups = ValidGroup2.class)
private String password;
@DateTimeFormat(iso=DateTimeFormat.ISO.DATE)
@Past(groups = ValidGroup2.class) // 過去の日付
private Date birthday1;
@DateTimeFormat(pattern="yyyy/MM/dd")
private Date birthday2;
@Min(value=5, groups = ValidGroup2.class)
@Max(value=100, groups = ValidGroup2.class)
private Integer age;
private MultipartFile accountIcon;
private Integer gender;
}
順番として、
- 必須入力の確認
- 入力内容の確認
の順で振り分けています。
ValidGroup1
のチェックが全てOKだった場合、ValidGroup2のチェックが行われます。
下記の画像の場合、パスワードはaaaaaaaa
なので、大文字を最低一文字含めないといけない要件を満たしていません。
しかし、エラーメッセージが出力されないのはユーザーIDとユーザー名がまだValidGroup1
を満たしていないからです。
4. SignupController.javaに内容を追加
// 省略
/* ユーザー登録処理 */
@PostMapping("/signup")
public String postSignup(Model model, Locale locale,
@Validated(GroupOrder.class) @ModelAttribute SignupForm form,
BindingResult bindingResult) {
// 入力チェック
if(bindingResult.hasErrors()) {
// エラーが発生したので登録画面に戻る
return getSignup(model, locale, form);
}
}
}
// 変更前
public String postSignup(Model model, Locale locale, @Validated @ModelAttribute SignupForm form, BindingResult bindingResult) { ...
// 変更後
public String postSignup(Model model, Locale locale, @Validated(GroupOrder.class) @ModelAttribute SignupForm form, BindingResult bindingResult) { ...
@Validated
アノテーションにGroupOrder.class
を追加することでバリデーションの実行順を設定することができます。
最後に
以上でバリデーションに順番を付けることができました。