spring bootを使用したバリデーション処理の実装について、お聞きしたいことがあります。
以下は、コントローラークラスの「InpurController.java」です。
@Controller public class InputController{ @GetMapping("/signUp") public String input(CheckRegister checkRegister,Model model){ return "signUp"; } @PostMapping(value = "/top",params="sign-up-form") public String signUpCheck(@Validated CheckRegister checkRegister,BindingResult error,Model model){ if(error.hasErrors()) { //System.out.println("22"); return "signUp"; } return "top"; } }
以下は、「CheckRegister.java」です
package com.example.demo; // import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; public class CheckRegister { @Size(min = 1,message = "名前を入力して下さい") @Size(max = 100,message = "名前の登録に失敗しました") private String name; @Size(min = 1,message = "メールアドレスを入力して下さい") @Size(min = 3,max=100,message = "メールアドレスの登録に失敗しました。") private String email; @Size(min = 1,message = "パスワードを入力して下さい。") @Size(min = 8,message = "パスワードは8文字以上を入力して下さい。") @Size(max = 100,message = "パスワードの登録に失敗しました") private String password; @Size(min = 1,message = "確認パスワードを入力して下さい") private String confirm_password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getConfirmPassword() { return confirm_password; } public void setConfirmPassword(String confirm_password) { this.confirm_password = confirm_password; } }
以下は、signUp.htmlです
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Boot de Bootstrap</title> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="stylesheet" media="all" th:href="@{/webjars/bootstrap/4.3.1/css/bootstrap.min.css}"/> <link rel="stylesheet" media="all" th:href="@{/css/signUp.css}"/> </head> <body th:object="${checkRegister}"> <div class="container"> <div class="row"> <div class="col-md-5 col-sm-8 top_element"> <ul> <li th:each="error : ${#fields.detailedErrors()}"> <span th:text="${error.message}">Error message</span> </li> </ul> <div class="bg-primary"> <p class="text-white text-center sign-up-title ">SIGN UP</p> </div> <div class="form_content"> <form method="post" th:action="@{/top}"> <div class="form-group"> <input type="text" name="name" placeholder="Name"> </div> <div class="form-group"> <input type="email" name="email" placeholder="Email"> </div> <div class="form-group"> <input type="password" name="password" placeholder="Password"> </div> <div class="form-group"> <input type="password" name="confirm_password" placeholder="ConfirmPassword"> </div> <button type="submit" class="btn btn-primary sign-up-btn" name="sign-up-form">Sign up</button> </form> </div> </div> </div> </div> <script type="text/javascript" th:src="@{/webjars/jquery/3.4.1/jquery.min.js}"></script> <script type="text/javascript" th:src="@{/webjars/bootstrap/4.3.1/js/bootstrap.min.js}"></script> </body> </html>
実行は、「Eclipse」より実行させ、getでのアクセスはブラウザに「http://localhost:8080/signUp」と打ち込み行いました。
解決した部分なのですが、signUp.htmlのform部分より、名前、パスワード、メールアドレス、確認パスワード、がpostにより送信され、エラーが存在した場合はsignUp.htmlにて表示さますが、CheckRegister.javaにて、行なったバリデーションに引っ掛かってしまった場合、全てのエラーメッセージが出力されてしまう点です。
仮に、全てのformの欄に何も入力せずに、「Sign Up」ボタンを押した場合、以下のメッセージが全て表示されます。
パスワードは8文字以上を入力して下さい。
パスワードを入力して下さい。
メールアドレスを入力して下さい
メールアドレスの登録に失敗しました。
名前を入力して下さい
そうではなく、何も入力されていない場合は、以下のメッセージのみを表示させるようにしたいです。
パスワードを入力して下さい。
メールアドレスを入力して下さい
名前を入力して下さい
こちらの解決方法がありましたら、教えて貰えましたら幸いです。
実行環境:
Eclipseのバージョン: Version: 2019-12 (4.14.0)
OS: MacOSMojave
追記
Qiitaの記事など、検索し調べてみましたが、解決に繋がる情報は載ってはいませんでした。
ちなみに、こちらもBeanValidationに関する記事ですが、載ってはいませんでした。
※過去質問も探しましたが、見つかりませんでした。
検索したキーワード「spring boot validation」「spring boot Beanvalidation」