【SpringBoot】SpringBootでバリデーションチェックを実装してみた。

こんにちは。くまごろーです。
SpringBootでは、アノテーションを活用すれば、簡単にフォームの入力チェックができます。
サーブレットアプリを作った時の様に、1つ1つのフィールドに対してif文を書いて・・・とかやらなくても、コントローラに「@Validated」、modelクラスに「BeanValidationのアノテーション」を不可すれば、SpringBootがバリデーションを実施してくれるみたいなんです。
というわけで、備忘録としてまとめます。

 
1 今回作るもの

今回は、簡単な例として会員情報登録画面的なものを作ろうと思います。
入力画面で名前・メールアドレス・パスワードを入力し、バリデーションバリデーションを実施して入力が正しければ結果画面に遷移、正しくなければエラーメッセージが表示される仕様です。
各要素の値は以下の通りに設定します。

フィールド 条件
name 入力必須/2文字以上20文字以下
email 入力必須/アドレス形式である
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= ) 文字列の長さが、指定の範囲内化を検証
@Email 文字列が有効なメールアドレスか検証
@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 実行結果
 
上記のコードで実行すると、以下のようになります。
 

f:id:kumaGoro_95:20201025205256p:plain
入力画面
f:id:kumaGoro_95:20201025205304p:plain
入力結果
f:id:kumaGoro_95:20201025205311p:plain
エラーメッセージ

 
 
6 参考
 
【今更ながらSpring BootでWEB開発 #4】バリデーション
Spring Bootの@Validatedでリクエストパラメータのバリデーションを行う - ブロックチェーンエンジニアとして生きる