LoginSignup
2
1

More than 1 year has passed since last update.

#17 Spring バリデーションの実行順序の変更

Posted at

#17 Spring バリデーションの実行順序の変更

前回は自分で設定したエラーメッセージが表示されるよう設定しました。
しかし、それだけでは不要なエラーメッセージも同時に表示されてしまうので、今回はエラーメッセージの表示順を設定します。

前提条件

この記事はSpringの最低限の知識が必要になります。
また、なるべく分かりやすく書くつもりですが、この記事の目的は自分の勉強のアウトプットであるため所々説明は省略します。

前回まで

前回の記事は以下になります。

構築環境

  1. 各バージョン
    Spring Boot ver 2.7.5
    jquery ver 3.6.1
    bootstrap ver 5.2.2
    webjars-locator ver 0.46

  2. 依存関係
    image.png

成果物

image.png
必須項目が入力されていない場合

image.png
入力内容に誤りがある場合

今回行うこと

今回は以下の流れに沿って進めていきます。

  1. GroupOrder.java, ValidGroup1.java, ValidGroup2.javaの作成
  2. GroupOrder.javaに内容を記述
  3. SignupForm.javaに内容を追加
  4. SignupController.javaに内容を追加

1. GroupOrder.java, ValidGroup1.java, ValidGroup2.javaの作成

src/main/java/com/example/formの直下に、GroupOrder.java, ValidGroup1.java, ValidGroup2.javaの3ファイルを作成します。
この3つのファイルは全てインターフェースです。
image.png

2. GroupOrder.javaに内容を記述

次にGroupOrder.java内に先ほど追加したValidGroup1.java, ValidGroup2.javaの2つのファイルを定義していきます。

GroupOrder.java
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クラスのバリデーションと先ほど登録したバリデーションの順番を紐付けて行きます。

SignupForm.java

// 省略

@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;
}

順番として、

  1. 必須入力の確認
  2. 入力内容の確認

の順で振り分けています。
ValidGroup1のチェックが全てOKだった場合、ValidGroup2のチェックが行われます。
下記の画像の場合、パスワードはaaaaaaaaなので、大文字を最低一文字含めないといけない要件を満たしていません。
しかし、エラーメッセージが出力されないのはユーザーIDとユーザー名がまだValidGroup1を満たしていないからです。
image.png

4. SignupController.javaに内容を追加

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を追加することでバリデーションの実行順を設定することができます。

最後に

以上でバリデーションに順番を付けることができました。

image.png
必須項目が入力されていない場合

image.png
入力内容に誤りがある場合

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1