こんにちは。くまごろーです。
SpringBootでは、アノテーションを活用すれば、簡単にフォームの入力チェックができます。
サーブレットアプリを作った時の様に、1つ1つのフィールドに対してif文を書いて・・・とかやらなくても、コントローラに「@Validated」、modelクラスに「BeanValidationのアノテーション」を不可すれば、SpringBootがバリデーションを実施してくれるみたいなんです。
というわけで、備忘録としてまとめます。
1 今回作るもの
今回は、簡単な例として会員情報登録画面的なものを作ろうと思います。
入力画面で名前・メールアドレス・パスワードを入力し、バリデーションバリデーションを実施して入力が正しければ結果画面に遷移、正しくなければエラーメッセージが表示される仕様です。
各要素の値は以下の通りに設定します。
フィールド | 条件 |
---|---|
name | 入力必須/2文字以上20文字以下 |
入力必須/アドレス形式である | |
password | 入力必須/4文字以上255文字以下 |
2 modelクラス
<MemberInfo.java>
package com.example.demo.model; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import lombok.Getter; import lombok.Setter; @Getter @Setter public class MemberInfo { //入力必須・文字列が2文字以上、20文字まで @NotBlank(message = "名前を入力してください") @Size(min = 2, max = 20, message = "名前は2文字以上、20文字以下で入力してください") private String name; //入力必須・メール形式 @NotBlank(message = "メールアドレスを入力してください") @Email(message = "不正なパスワードです") private String email; //入力必須・文字列4文字以上、255文字以下 @NotBlank(message = "パスワードを入力してください") @Size(min = 4, max = 255, message = "パスワードは4文字以上、255文字以下で入力してください") private String password; }
条件を設定したい変数に対し、「@NotBlank」、「Size」等のアノテーションを付加します。
アノテーションには以下のようなものがあります。
アノテーション | 効果 |
---|---|
@NotBlank | 文字列が、nullが空文字、空白でないかを検証 |
@NotEmpty | 文字列が、nullか空文字でないかを検証 |
@NotNull | nullでないことを検証 |
@Size(min= , max= ) | 文字列の長さが、指定の範囲内化を検証 |
文字列が有効なメールアドレスか検証 | |
@Min( ) | 指定の値以上化を検証 |
@Max | 指定の値以下か検証 |
また、アノテーション内に「message」を設定すると、viewファイルでエラーメッセージとして利用できます。
3 Controllerクラス
<HomeController.java>
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import com.example.demo.model.MemberInfo; @Controller public class HomeController { @GetMapping("/") public String index(@ModelAttribute MemberInfo memberInfo) { return "input"; } @PostMapping("/") //@Validatedを付加すると、バリデーションを行うことができる。 //バリデーションの結果はBindingResultに入り、result.hasErrors()でエラーがあるか確認できる。 public String confirm(@Validated @ModelAttribute MemberInfo memberInfo, BindingResult result) { if(result.hasErrors()) { return "input"; }return "output"; } }
※ BindingResultは「Errors」というインターフェースを継承するサブインターフェースで、アノテーションを使って値をバインドした結果を得ることができる。エラーが発生しているかどうかは、「hasErrors」メソッドで調べることができる。
4 Viewファイル
エラーメッセージについてはmodelクラスで前述しましたが、Thymeleafでエラーメッセージを表示するには、「th:errors」タグを使用します。
<input.html>
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>登録画面</h1> <form th:action="@{/}" th:object="${memberInfo}" method="post" novalidate> <p>名前</p> <input type="text" th:errorclass="is-invalid" th:field="*{name}"> <div class="invalid-feedback" th:errors="*{name}"></div> <p>メールアドレス</p> <input type="text" th:errorclass="is-invalid" th:field="*{email}"> <div class="invalid-feedback" th:errors="*{email}"></div> <p>パスワード</p> <input type="password" class="form-control" th:errorclass="is-invalid" th:field="*{password}"> <div class="invalid-feedback" th:errors="*{password}"></div> <br> <button type="submit" th:text="登録"></button> </form> </body> </html>
<output.html>
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>入力結果</h1> <div th:object="${memberInfo}"> <p>名前</p> <input type="text" th:field="*{name}"> <p>Email</p> <input type="text" th:field="*{email}"> <p>パスワード</p> <input type="text" th:field="*{password}"> </div> </body> </html>
5 実行結果
上記のコードで実行すると、以下のようになります。
6 参考
【今更ながらSpring BootでWEB開発 #4】バリデーション
Spring Bootの@Validatedでリクエストパラメータのバリデーションを行う - ブロックチェーンエンジニアとして生きる