##springのバリデーション に関して
spring Boot2でアカウント機能の作成をしています。
入力値に対してバリデーション をグループ化したいのですが
思ったような機能ができませんのでアドバイスをいただけると幸いです。
java
1public class AccountForm implements Serializable { 2 3 private static final long serialVersionUID = 1L; 4 5 @NotEmpty(message="ユーザー名を入力してください") 6 @Size(min=1,max=12,message="ユーザー名の長さが不適切です", 7 groups=Group1.class) 8 @Pattern(regexp="[a-zA-Z0-9亜-熙ぁ-んァ-ヶ#$@%&*._^(){}-]+", 9 message="不適切な文字が含まれています",groups=Group2.class) 10 private String userName; 11 12 @NotEmpty(message="メールアドレスを入力してください") 13 @Email(message="メールアドレスが不正です",groups=Group1.class) 14 private String mailAddress; 15 16 @Size(min=8,max=12,message="パスワードは8~12文字の英数字で入力してください") 17 @Pattern(regexp="[a-zA-Z0-9]+",message="パスワードは英数字で入力してください",groups=Group1.class) 18 private String password; 19 private String confirmPassword; 20
java
1import javax.validation.GroupSequence; 2import javax.validation.groups.Default; 3 4@GroupSequence(value= {Default.class,Group1.class,Group2.class}) 5public interface GroupOrder {}
java
1public interface Group1 {}
java
1public interface Group2 {}
java
1@Controller 2public class AccountController { 3 4 @Autowired 5 UserService userService; 6 @Autowired 7 private PasswordEqualsValidator passwordEqualsValidator; 8 //パスワード確認をオリジナルのバリデータに追加 9 @InitBinder 10 public void initBinder(WebDataBinder binder) { 11 binder.setValidator(passwordEqualsValidator); 12 } 13 14 @ModelAttribute 15 public AccountForm setupForm() { 16 return new AccountForm(); 17 } 18 19 @GetMapping(value="/account") 20 String accountForm() { 21 return "account/accountForm"; 22 } 23 24 @PostMapping(value="account") 25 String create(@Validated(GroupOrder.class) AccountForm form, 26 BindingResult bindingResult) { 27 if(bindingResult.hasErrors()) { 28 return "account/accountForm"; 29 } 30 31 User user = new User(); 32 user.setMailAddress(form.getMailAddress()); 33 user.setUserName(form.getUserName()); 34 userService.create(user,form.getPassword()); 35 return "redirect:/account/complete"; 36 } 37 38 @GetMapping(value="account/complete") 39 String createFinish() { 40 return "account/complete"; 41 42 } 43} 44
html
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="UTF-8" /> 5<title>ユーザー登録</title> 6<style> 7.err { 8 color: red; 9} 10</style> 11</head> 12<body> 13 <div> 14 <h1>ユーザー登録</h1> 15 <table> 16 <form th:action="@{/account}" action="/account" th:object="${accountForm}" method="post"> 17 <tr><td><label for="userName">ユーザ名:</label></td> 18 <td><input type="text" name="userName" th:field="*{userName}" th:errorclass="err"/> 19 <div th:if="${#fields.hasErrors('userName')}" th:errors="*{userName}" th:errorclass="err"> 20 </div> 21 </td> 22 </tr> 23 <tr> 24 <td><label for="mailAddress">メールアドレス</label></td> 25 <td><input type="text" name="mailAddress" th:field="*{mailAddress}" th:errorclass="err"/> 26 <div th:if="${#fields.hasErrors('mailAddress')}" th:errors="*{mailAddress}" th:errorclass="err"> 27 </div> 28 </td> 29 </tr> 30 <tr> 31 <td><label for="password">パスワード</label></td> 32 <td><input type="password" name="password" th:field="*{password}" th:errorclass="err"/> 33 <div th:if="${#fields.hasErrors('password')}" th:errors="*{password}" th:errorclass="err"> 34 </div> 35 </td> 36 </tr> 37 <tr> 38 <td><label for="confirmPassword">パスワード(確認)</label></td> 39 <td><input type="password" name="confirmPassword" th:field="*{confirmPassword}" th:errorclass="err"/> 40 <div th:if="${#fields.hasErrors('confirmPassword')}" th:errors="*{confirmPassword}" th:errorclass="err"> 41 </div> 42 </td> 43 </tr> 44 <tr><td></td><td><input type="submit" value="新規登録" /></td></tr> 45 </form> 46 </table> 47 </div> 48</body> 49</html>
以上のようにそれぞれのバリデーション に対するメッセージをグループ化して
Default,group1,group2の順にバリデーション を適用させたいのですが
@NotEmptyに対するバリデーション のみ機能して、@Emailなどのバリデーション が効かなくなってしまいます。Groupを適用していない場合は問題なくバリデーション が聞いていたのでgroupの部分に問題があると考えていますが、原因がわかりません。
###全て未入力の場合(未入力チェックは成功)
###ユーザー名、パスワードにaを入れた(@Email,ユーザ名の長さのバリデーション が効かない)
エラーが表示されないだけではなく
実際に登録もできてしまいます。
アドバイスをいただけると幸いです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/23 01:26
2020/02/23 01:28
2020/02/23 02:48