😸
SpringBootでバリデーションの順番を変える
備忘録として残します
課題
下記の場合、空が入力された場合出力されるメッセージはランダムになる。(メッセージやその他の不適切(ソフトコーディング)な箇所は無視でお願いしますm(__)m
@NotBlank(message = "パスワードを入力してください。", groups = First.class)
@Pattern(
regexp = "xxxxxxxxxxxx",
message = "パスワードは英数字と記号を含み、255文字以内で入力してください。", groups = Second.class)
private String password;
バリデーションの順序を変更する
修正が必要なクラス
- グループクラス(このクラスを各バリデーションチェックに紐づけ順序を制御する)
- グループの順番を制御するクラス(コントローラへ紐づける。オーダークラスとする)
- コントローラへオーダクラスを適用
- Dto
[グループクラス]最初にチェックを行うクラス
package com.example.demo.validation;
public interface First {
}
[グループクラス]2番目にチェックを行うクラス(1番目を通過した場合)
package com.example.demo.validation;
public interface Second {
}
[グループの順番を制御するクラス(オーダークラスとする)]
・「@GroupSequence({First.class, Second.class, Third.class})」で順番を制御
package com.example.demo.validation;
import jakarta.validation.GroupSequence;
@GroupSequence({First.class, Second.class, Third.class})
public interface ValidationOrder {
}
[Dto]
・チェック毎に順番を定義
@NotBlank(message = "メールアドレスを入力してください。", groups = First.class)
@Email(message = "有効なメールアドレスを入力してください。", groups = Second.class)
@Size(max = 255, message = "メールアドレスは255文字以内で入力してください。", groups = Second.class)
private String mail;
[コントローラへオーダクラスを適用]
・「@Validated(ValidationOrder.class)」で「オーダークラス」を指定
@PostMapping("/register")
public ResponseEntity<AuthenticationResponse> register(
@Validated(ValidationOrder.class) @RequestBody RegisterRequest request) {
return ResponseEntity.ok(service.register(request));
}
Discussion