職業訓練覚え書き

50日目(Spring Framework8)

昨日のおさらい

hibernate validatorでアノテーションでバリデーションができるようにする


エラー表示

<form:errors />

フィールドエラー、グローバルエラーの表示

フィールドエラー⇒オブジェクトの特定のフィールドのエラー
 例:<form:errors path="register.name" />
グローバルエラー⇒オブジェクト全体のエラー
 例:<form:errors path="register" />


@PostMapping("/register")
public String registerPost(
 @Valid Register register, // @ModelAttribute("register")省略
 Errors errors) {
 if(!register.getConfMail().equals(register.getMail())) {
 // フィールドエラーの追加
 // path="register.confMail"で出力される
  errors.rejectValue("confMail", "register.mail.notsame");
 } ※第一引数がフィールド名、第二引数は任意。あとで使う
 if(errors.hasErrors()) {
 // グローバルエラーの追加
 // path="register"で出力される
  errors.reject("register.imperfect");
※引数は任意。これも後で使う
  return "register";
 } else {
  return "done";
 }
}

errorsオブジェクトのrejectValue()、reject()メソッドで設定した↓

  • register.mail.notsame
  • register.imperfect

これらをプロパティファイル(messages.properties)に追記、それぞれ出力されるエラーメッセージを設定する

書き方例:
register.mail.notsame=メールアドレスが一致しません
register.imperfect=入力に不備があります


バリデーショングループ

特定の場面でバリデーションを行う場合にグループ分けする
(会員登録の際は氏名、ログインID、パスワードが必要だが登録後のログインはログインIDとパスワードの入力のみ、みたいなやつ)

 

①以下のフォームをもつjspを用意

  • 氏名 name
  • ログインID loginId
  • パスワード loginPass
  • パスワード(確認用) loginPassConf

 

②対応したdomainクラスを定義
 フィールドとアクセッサを用意
 かつ、フィールドすべてに@NotBlankをつける
 ただし、ログイン時にはログインIDとパスワードのみ必須にしたい

 

③それを実現するためにマーカーインターフェースを作る
1.AddGroupインタフェースをdomain内に
※なにも中身を記述しない(マーカーインターフェースの特徴)
2.LoginGroupインタフェースをdomain内に
※やはり中身なし

  パッケージはdomainでなくてもいい。

 

④先に定義していたdomainクラスに戻り、

 

@NotBlank(groups= {AddGroup.class})
private String name;
↑登録時(AddGroupにのみ属する)

 

@NotBlank(groups= {AddGroup.class, LoginGroup.class})
private String loginId;
↑登録時、ログイン時(AddGroup、LoginGroup両方に所属)

 

他のフィールドもルールに沿ってグループ分け

 

⑤以上を踏まえてControllerクラスを作る

まずは@GetMappingから用意

登録時のjsp
@GetMapping("/addUser")
public String addGet(Model model) {
 model.addAttribute("user", new User());
 return "userForm";
}
ログイン時のjsp
@GetMapping("/login")
public String loginGet(Model model) {
 model.addAttribute("user", new User());
 return "userForm";
}

2つともアクセスするURLが異なるだけで、表示されるフォームは同じ

 

次にPostMapping
グループ分けした部分をバリデーションできるように記述

@PostMapping("/addUser")
public String addPost(
 @Validated(AddGroup.class) User user,
 Errors errors) {
  if(errors.hasErrors()) {
   return "userForm";
  } else {
   return "done";
  }
 }

@PostMapping("/login")
public String loginPost(
 @Validated(LoginGroup.class) User user,
 Errors errors) {
  if(errors.hasErrors()) {
   return "userForm";
  } else {
   return "done";
  }
 }

エラーがなければ完了ページ(done.jsp)に飛び、そうでなければフォームが表示され続ける。
※今回はエラーメッセージ等は用意せず

 

今日はここまで。

昨日詰まってたところが単なるタイプミスだったことがわかった一日

睡眠って大事、ということを改めて学んだ32歳。