###実現したいことと問題点
書籍:Springの解体新書 第二版の6章でつまずいております。
spring bootの画面アプリです。
フォームクラスを作成し、javax.validationを使って各入力フォームにバリデーションチェックの処理を入れました。
しかし、画面を開くとバリデーションチェックがされません。(空文字チェックなど)
なぜでしょうか?
###試したこと
**①mavenへの依存関係の設定
pom.xmlへの設定が問題かと思い、色々試しましたが結局できませんでした。
(ex)↓の設定を追加したり、抜かしたりしました。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version> <!-- または最新のバージョン -->
</dependency>
※参考サイト
https://qiita.com/tatetsujitomorrow/items/a397c311a95d66e4f955
https://qiita.com/shikanomoto/items/6e5ec1d6885942c22046
https://dev.thanaism.com/2021/11/coding-java/
**②javafxが使えない?
バージョン的にjavafxが使えないと思い、
import javax.validation.constraints.;の部分をすべて
import org.hibernate.validator.constraints.;
に変更して試したところ、うまくバリデーションチェックが動きました。
ただ、調べるとhibernateの方は非推奨であることや古いバージョンであることから、
なんとかjavafx.validationを使うやり方で実装を行いたいです。
###ソースコード
**全部で6つあります
①LoginController.java 一番最初に処理を受け付けるコントローラー
②login.html ①から遷移する画面 ログイン画面
③SignupController.java 入力画面に遷移させるコントローラー
④signup.html ③から遷移する画面 ログイン情報登録画面
⑤SignupForm.java 今回問題となっているフォームクラス
⑥pom.xml mavenの設定ファイル
LoginController.java
1package com.example.controller; 2 3import org.springframework.stereotype.Controller; 4import org.springframework.web.bind.annotation.GetMapping; 5 6@Controller 7public class LoginController { 8 @GetMapping("/login") 9 public String getLogin() { 10 return "login/login"; 11 } 12}
login.html
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device^width,initial-scale=!,shrink-to-fit=no"> 7 </meta> 8 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 9 <link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}"> 10 <link rel="stylesheet" th:href="@{/css/login/login.css}"> 11 <script th:src="@{/webjars/jquery/jquery.min.js}" defer></script> 12 <script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}" defer></script> 13 <title>ログイン</title> 14</head> 15 16<body class="bg-warning"> 17 <div class="text-center"> 18 <form method="post" th:action="@{/login}" class="form-login"> 19 <h2>ログイン</h2> 20 <div class="form-group"> 21 <label for="userld" class="d-none">userld</label> 22 <input type="text" class="form-control" placeholder="ユーザID" name="userld" /> 23 </div> 24 <div class="form-group"> 25 <label for="password" class="sr-only">password</label> 26 <input type="text" class="form-control" placeholder="パスワード" name=" password" /> 27 </div> 28 <input type="submit" value="ログイン" class="btn btn-primary" /> 29 </form> 30 <b> 31 <a th:href="@{/user/signup}">新規登録はこちら</a> 32 </b> 33 </div> 34</body> 35 36</html>
SignupController.java
1package com.example.controller; 2 3import java.util.Locale; 4import java.util.Map; 5 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.stereotype.Controller; 8import org.springframework.ui.Model; 9import org.springframework.validation.BindingResult; 10import org.springframework.validation.annotation.Validated; 11import org.springframework.web.bind.annotation.GetMapping; 12import org.springframework.web.bind.annotation.ModelAttribute; 13import org.springframework.web.bind.annotation.PostMapping; 14import org.springframework.web.bind.annotation.RequestMapping; 15 16import com.example.application.service.UserApplicationService; 17import com.example.form.SignupForm; 18 19import lombok.extern.slf4j.Slf4j; 20 21@Controller 22@RequestMapping("/user") 23@Slf4j 24public class SignupController { 25 @Autowired 26 private UserApplicationService userApplicationService; 27 28 @GetMapping("/signup") 29 public String getSignup(Model model, Locale locale, @ModelAttribute SignupForm form) { 30 Map<String, Integer> genderMap = userApplicationService.getGenderMap(locale); 31 model.addAttribute("genderMap", genderMap); 32 return "user/signup"; 33 } 34 35 @PostMapping("/signup") 36 public String postSignup(Model model, Locale locale, @ModelAttribute @Validated SignupForm form, BindingResult bindingResult) { 37 38 //入力チェック 39 if (bindingResult.hasErrors()) { 40 return getSignup(model, locale, form); 41 } 42 43 log.info(form.toString()); 44 45 return "redirect:/login"; 46 } 47}
signup.html
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device^width,initial-scale=!,shrink-to-fit=no"> 7 </meta> 8 <link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}"> 9 <link rel="stylesheet" th:href="@{/css/user/signup.css}"> 10 <script th:src="@{/webjars/jquery/jquery.min.js}" defer></script> 11 <script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}" defer></script> 12 <title th:text="#{user.signup.title}"></title> 13</head> 14 15<body class="bg-warning"> 16 <form id="signup-form" method="post" action="/user/signup" class="form-signup" th:object="${signupForm}"> 17 <h1 class="text-center" th:text="#{user.signup.title}">ユーザ登録</h1> 18 <div class="form-group"> 19 <label for="userId" th:text="#{userId}">ユーザID</label> 20 <input type="text" class="form-control" th:field="*{userId}" th:errorclass="is-invalid" /> 21 <div class="invalid-feedback" th:errors="*{userId}"></div> 22 </div> 23 <div class="form-group"> 24 <label for="password" th:text="#{password}">パスワード</label> 25 <input type="text" class="form-control" th:field="*{password}" th:errorclass="is-invalid" /> 26 <div class="invalid-feedback" th:errors="*{password}"></div> 27 </div> 28 <div class="form-group"> 29 <label for="userName" th:text="#{userName}">ユーザ名</label> 30 <input type="text" class="form-control" th:field="*{userName}" th:errorclass="is-invalid" /> 31 <div class="invalid-feedback" th:errors="*{userName}"></div> 32 </div> 33 <div class="form-group"> 34 <label for="birthday" th:text="#{birthday}">誕生日</label> 35 <input type="text" class="form-control" placeholder="yyyy/mm/dd" th:field="*{birthday}" 36 th:errorclass="is-invalid" /> 37 <div class="invalid-feedback" th:errors="*{birthday}"></div> 38 </div> 39 <div class="form-group"> 40 <label for="age" th:text="#{age}">年齢</label> 41 <input type="text" class="form-control" th:field="*{age}" th:errorclass="is-invalid" /> 42 <div class="invalid-feedback" th:errors="*{age}"></div> 43 </div> 44 <div class="form-group"> 45 <div th:each="item:${genderMap}" class="form-check-inline"> 46 <input type="radio" class="form-check-input" th:value="${item.value}" th:field="*{gender}" 47 th:errorclass="is-invalid" /> 48 <label class="form-check-label" th:text="${item.key}"></label> 49 </div> 50 <div class="invalid-feedback" th:errors="*{gender}"></div> 51 </div> 52 <input type="submit" th:value="#{user.signup.btn}" value="ユーザ登録" class="btn btn-primary w-100 mt-3" /> 53 </form> 54</body> 55 56</html>
SignupForm.java
1package com.example.form; 2 3import java.util.Date; 4 5import javax.validation.constraints.Email; 6import javax.validation.constraints.Max; 7import javax.validation.constraints.Min; 8import javax.validation.constraints.NotBlank; 9import javax.validation.constraints.NotNull; 10import javax.validation.constraints.Pattern; 11import javax.validation.constraints.Size; 12 13import org.springframework.format.annotation.DateTimeFormat; 14 15import lombok.Data; 16 17@Data 18public class SignupForm { 19 @NotBlank 20 @Email 21 private String userId; 22 23 @NotBlank 24 @Size(min=4,max=100) 25 @Pattern(regexp="^[a-zA-Z0-9]+$") 26 private String password; 27 28 @NotBlank 29 private String userName; 30 31 @DateTimeFormat(pattern="yyyy/mm/dd") 32 @NotNull 33 private Date birthday; 34 35 @Min(20) 36 @Max(100) 37 private Integer age; 38 39 @NotNull 40 private Integer gender; 41} 42
###バージョン
Java:17
Spring boot:3.2.2
Version: 2023-12 (4.30.0)
回答1件
あなたの回答
tips
プレビュー