😸

SpringBootでバリデーションの順番を変える

2024/09/09に公開

備忘録として残します

課題

下記の場合、空が入力された場合出力されるメッセージはランダムになる。(メッセージやその他の不適切(ソフトコーディング)な箇所は無視でお願いします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