【Java・SpringBoot・Thymeleaf】バリデーションエラーメッセージを変更（SpringBootアプリケーション実践編4）

ログインをして、ユーザー一覧を表示するアプリケーションを作成し、
Springでの開発について勉強していきます🌟
前回のエラーメッセージ実装に引き続き、**メッセージプロパティファイルを複数用意して切り替える**方法を実装します

前回の記事🌟
[【Java・SpringBoot・Thymeleaf】エラーメッセージを実装（SpringBootアプリケーション実践編3）](https://qiita.com/suema0331/items/75aacb4c9632978731a1)

#ユーザー登録画面用のフォームクラスにバリデーション実装
* **フォームクラスの各フィールドにアノテーションを付けるだけ！**で入力チェックが出来る
* **NotNull・NotEmpty・NotBlankの違い**

|アノテーション|null|空文字|空白|
|:-:|:-:|:-:|:-:|
|@NotNull|NG|OK|OK|
|@NotEmpty|NG|NG|OK|
|@NotBlank|NG|NG|NG|


```SignupForm.java
package com.example.demo.login.domain.model;
import java.util.Date;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;

@Data
public class SignupForm {
    //入力形式、メールアドレス形式
    @NotBlank
    @Email
    private String userId; //ユーザーID

    //入力必須、長さ4-100桁まで、半角英数字のみ
    @NotBlank
    @Length(min= 4 ,max = 100)
    @Pattern(regexp = "^[a-zA-Z0-9]+$")
    private String password; //パスワード

    //入力必須
    @NotBlank
    private String userName; //ユーザー名

    //入力必須
    @NotNull
    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date birthday; //誕生日

    //値は20-100
    @Min(20)
    @Max(100)
    private int age; //年齢

    //falseのみ可能
    @AssertFalse
    private boolean marriage; //結婚ステータス

}

```

#コントローラークラス修正
##バリデーションの実施
* 引数のフォームクラスに**@Validated**アノテーションを付ける
    * バリデーションのチェック結果は**BindingResultクラス**に入る
    * →**バリデーションを使う場合、BindingResultクラスを引数に設定する必要がある**

```java
public String postSignUp(@ModelAttribute @Validated SignupForm form,
                         BindingResult bindingResult,
                         Model model) {...}
```

##@Validatedと@Valid
* @Validated：Spring標準のアノテーション。今回は@Validatedを使用
* @Valid：J2EEから標準で搭載されているBeanValidator（バリデーション用のアノテーション）<br>メッセージプロパティファイル名、エラーメッセージの書き方が違う

```SignupController.java
package com.example.demo.login.controller;

import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.login.domain.model.SignupForm;

@Controller
public class SignupController {

    //ラジオボタン用変数
    private Map<String, String> radioMarriage;

    //ラジオボタンの初期化メソッド
    private Map<String, String> initRadioMarrige() {
        Map<String, String> radio = new LinkedHashMap<>();
        // 既婚、未婚をMapに格納
        radio.put("既婚", "true");
        radio.put("未婚", "false");
        return radio;
    }

    //ユーザー登録画面のGET用コントローラ
    @GetMapping("/signup")
    public String getSignUp(@ModelAttribute SignupForm form, Model model) {

        // ラジオボタンの初期化メソッド呼び出し
        radioMarriage = initRadioMarrige();
        // ラジオボタン用のMapをModelに登録
        model.addAttribute("radioMarriage", radioMarriage);
        // signup.htmlに画面遷移
        return "login/signup";
    }

    //ユーザー登録画面のPOST用コントローラ
    //バリデーション実装
    @PostMapping("/signup")
    public String postSignUp(@ModelAttribute @Validated SignupForm form,
                             BindingResult bindingResult,
                             Model model) {

        // 入力チェックに引っかかった場合、ユーザー登録画面に戻る
        if (bindingResult.hasErrors()) {
            // GETリクエスト用のメソッドを呼び出して、ユーザー登録画面に戻る
            return getSignUp(form, model);
        }

        // formの中身をコンソールで確認
        System.out.println(form);
        // login.htmlにリダイレクト
        return "redirect:/login";
    }
}
```

#SpringBootを起動、新規登録画面を確認！
* http://localhost:8080/login 
* ユーザー登録画面で何も入力せずユーザー登録ボタンを押すと、エラーメッセージが表示されました〜〜
* 今のままでは英語のメッセージなので、次回は入力チェックのエラーメッセージを編集して日本語化します^o^

![バリデーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/61998ab5-f406-6d30-462c-04a5eb2bcf2b.png)