現在以下サイトでSpringをで学習しているのですが
以下エラーが表示され先に進めません。
入力ミスはなさそうなので私なりに考えると「th:object=${SignupForm}」に何も値が入っていない為
表示できずエラーになっていそうなのですが、なぜ参考サイトではうまくいっているのか?
そしてどのようにすればSignupFormに値が入るのか教えていただけると幸いです。
丸投げとなってしまい申し訳ないのですがよろしくお願いいたします。
参考サイト
【Java・SpringBoot・Thymeleaf】データバインド(SpringBootアプリケーション実践編2)
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/login/signup.html]") Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "login/signup" - line 25, col 69) Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'userId' of bean class [com.example.demo.login.domain.model.SignupForm]: Bean property 'userId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 2022-07-05 23:57:15.808 ERROR 8384 --- [nio-8080-exec-5] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-5] Exception processing template "login/signup": An error happened during template parsing (template: "class path resource [templates/login/signup.html]")
loginController.java
1package com.example.demo.login.controller; 2 3import org.springframework.stereotype.Controller; 4import org.springframework.ui.Model; 5import org.springframework.web.bind.annotation.GetMapping; 6import org.springframework.web.bind.annotation.PostMapping; 7 8@Controller 9public class LoginController { 10 11 //ログイン画面のGET用コントローラ 12 @GetMapping("/login") 13 public String getLogin(Model model) { 14 15 //login.htmlに画面遷移 16 return "login/login"; 17 18 } 19 20 //ログイン画面のPOST用コントローラ 21 @PostMapping("/login") 22 public String postLogin(Model model) { 23 24 //login.htmlに画面遷移 25 return "login/login"; 26 } 27} 28
SignupController.java
1package com.example.demo.login.controller; 2 3import java.util.LinkedHashMap; 4import java.util.Map; 5 6import org.springframework.stereotype.Controller; 7import org.springframework.ui.Model; 8import org.springframework.validation.BindingResult; 9import org.springframework.web.bind.annotation.GetMapping; 10import org.springframework.web.bind.annotation.ModelAttribute; 11import org.springframework.web.bind.annotation.PostMapping; 12 13import com.example.demo.login.domain.model.SignupForm; 14 15@Controller 16public class SignupController { 17 18 //ラジオボタンの実装 19 private Map<String, String>radioMarriage; 20 21 private Map<String, String>initRadioMarrige(){ 22 23 Map<String, String>radio = new LinkedHashMap<>(); 24 25 radio.put("既婚", "true"); 26 radio.put("未婚", "false"); 27 28 return radio; 29 } 30 31 //GETメソッド 32 @GetMapping("/signup") 33 public String getSignUp(@ModelAttribute SignupForm form, Model model) { 34 // ラジオボタンの初期化メソッド呼び出し 35 radioMarriage = initRadioMarrige(); 36 // ラジオボタン用のMapをModelに登録 37 model.addAttribute("radioMarriage", radioMarriage); 38 // signup.htmlに画面遷移 39 return "login/signup"; 40 } 41 42 //POSTメソッド 43 //データバインド結果の受けとり 44 @PostMapping("/signup") 45 public String postSignUp(@ModelAttribute SignupForm form, 46 BindingResult bindingResult, 47 Model model) { 48 // 入力チェックに引っかかった場合、ユーザー登録画面に戻る 49 if (bindingResult.hasErrors()) { 50 // GETリクエスト用のメソッドを呼び出して、ユーザー登録画面に戻る 51 return getSignUp(form, model); 52 } 53 // formの中身をコンソールに出して確認 54 System.out.println(form); 55 // login.htmlにリダイレクト 56 return "redirct:/login"; 57 } 58 59} 60
login.html
1<!DOCTYPE HTML> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <!--Bootstrapの設定--> 6 <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel="stylesheet"></head> 7 <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> 8 <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> 9 10 <title>Login</title> 11</head> 12 13<body class="text-center"> 14 <h1>Login</h1> 15 <form method="post" action="/login"> 16 <label>ユーザID</label> 17 <input type="text"/><br /> 18 <br /> 19 20 <label>パスワード</label> 21 <input type="password"/><br /> 22 <br /> 23 24 <button class="btn btn-primary" type="submit">ログイン</button> 25 </form> 26 <br /> 27 28 <a th:href="@{'/signup'}">ユーザ新規登録はこちら</a> 29</body> 30 31</html>
signup.html
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4 <meta charset="UTF-8"></meta> 5 6 <!-- Bootstrapの設定 --> 7 <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel="stylesheet"></link> 8 <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> 9 <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> 10 11 <title>SignUp</title> 12</head> 13<body> 14 <div class="col-sm-5"> 15 <div class="page-header"> 16 <h1>ユーザー登録画面</h1> 17 </div> 18 <form method="post" th:action="@{/signup}" th:object="${signupForm}"> 19 <table class="table table-bordered table-hover"> 20 <!-- ユーザーID --> 21 <tr> 22 <th class="active col-sm-3">ユーザID</th> 23 <td> 24 <div class="form-group"> 25 <input type="text" class="form-control" th:field="*{userId}" /> 26 </div> 27 </td> 28 </tr> 29 <!-- パスワード --> 30 <tr> 31 <th class="active">パスワード</th> 32 <td> 33 <div class="form-group"> 34 <input type="text" class="form-control" th:field="*{password}" /> 35 </div> 36 </td> 37 </tr> 38 <!-- ユーザー名 --> 39 <tr> 40 <th class="active">ユーザー名</th> 41 <td> 42 <div class="form-group"> 43 <input type="text" class="form-control" th:field="*{userName}" /> 44 </div> 45 </td> 46 </tr> 47 <!-- 誕生日 --> 48 <tr> 49 <th class="active">誕生日</th> 50 <td> 51 <div class="form-group"> 52 <input type="text" class="form-control" placeholder="yyyy/MM/dd" th:field="*{birthday}"/> 53 </div> 54 </td> 55 </tr> 56 <!-- 年齢 --> 57 <tr> 58 <th class="active">年齢</th> 59 <td> 60 <div class="form-group"> 61 <input type="text" class="form-control" th:field="*{age}" /> 62 </div> 63 </td> 64 </tr> 65 <!-- 結婚 --> 66 <tr> 67 <th class="active">結婚</th> 68 <td> 69 <div class="form-group"> 70 <div th:each="item : ${radioMarriage}"> 71 <input type="radio" name="radioMarrige" 72 th:text="${item.key}" 73 th:value="${item.value}" 74 th:field="*{marriage}"> 75 </input> 76 </div> 77 </div> 78 </td> 79 </tr> 80 </table> 81 <!-- エラーメッセージの一覧表示 --> 82 <ul> 83 <li th:each="error : ${#fields.detailedErrors()}"> 84 <span th:text="${error.message}">Error message</span> 85 </li> 86 </ul> 87 88 <button class="btn btn-primary" type="submit">ユーザー登録</button> 89 </form> 90 </div> 91</body> 92</html>
SignupForm.java
1package com.example.demo.login.domain.model; 2 3import java.util.Date; 4import org.springframework.format.annotation.DateTimeFormat; 5import lombok.Data; 6 7@Data 8public class SignupForm { 9 private String userId; 10 private String userName; 11 @DateTimeFormat(pattern = "yyyy/MM/dd") 12 private Date birthday; 13 14 private int age; 15 private boolean marriage; 16 17} 18

あなたの回答
tips
プレビュー