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


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

前回の記事🌟
【Java・SpringBoot・Thymeleaf】エラーメッセージを実装(SpringBootアプリケーション実践編3)

ユーザー登録画面用のフォームクラスにバリデーション実装

  • フォームクラスの各フィールドにアノテーションを付けるだけ!で入力チェックが出来る
  • 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クラスを引数に設定する必要がある
public String postSignUp(@ModelAttribute @Validated SignupForm form,
                         BindingResult bindingResult,
                         Model model) {...}

@Validated@Valid

  • @Validated:Spring標準のアノテーション。今回は@Validatedを使用
  • @Valid:J2EEから標準で搭載されているBeanValidator(バリデーション用のアノテーション)
    メッセージプロパティファイル名、エラーメッセージの書き方が違う
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^