質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3496閲覧

【spring】@GroupSequenceを使った処理が思い通りに動作しません

Neru_K

総合スコア19

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/01/02 10:12

編集2020/01/02 10:20

書籍を見ながらspring bootでユーザー登録画面を作っています。
現在は登録チェックのためのバリデーションに取り掛かっているところです。
ユーザーIDやパスワードを入力し、入力チェックの条件から外れるとエラーメッセージが出る、というところまでは問題なくできました。
(↓下記のような画面までは正常にできています)
イメージ説明

次にそれらのエラーメッセージを@GroupSequenceでまとめ、例えばパスワードのエラーをValidGroup1,ValidGroup2,ValidGroup3それぞれに分け、ValidGroup1のチェックをクリアしたらValidGroup2のチェックをする、ということをしようとしました。
ところがいざ動作させてみるとValidGroup1にまとめたエラーメッセージは表示されるものの、ValidGroup2、3のメッセージは表示されません。
(パスワード欄を空欄にすると「パスワードは必須入力です」と表示されるが、「あ」とだけ入力しても本来出るはずのエラーメッセージが出ない)

書籍通りに作っているつもりなのですが、何が間違っているのかさっぱりわかりません。
ご教示いただけましたら幸いです。

該当のソースコード

java

1package com.example.demo.login.controller; 2import java.util.LinkedHashMap; 3import java.util.Map; 4 5import org.springframework.stereotype.Controller; 6import org.springframework.ui.Model; 7import org.springframework.validation.BindingResult; 8import org.springframework.validation.annotation.Validated; 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.GroupOrder; 14import com.example.demo.login.domain.model.SignupForm; 15 16@Controller 17public class SignupController { 18 19 //ポイント1:ラジオボタンの実装 20 private Map<String,String> radioMarriage; 21 22 //ラジオボタンの初期化メソッド 23 private Map<String,String> initRadioMarrige(){ 24 25 Map<String,String> radio = new LinkedHashMap<>(); 26 27 //既婚、未婚をMapに格納 28 radio.put("既婚","true"); 29 radio.put("未婚","false"); 30 31 return radio; 32 } 33 34 //ユーザー登録画面のGET用コントローラー 35 //ポイント2:データバインド結果の受け取り 36 @GetMapping("/signup") 37 public String getSignUp(@ModelAttribute SignupForm form, Model model) { 38 39 //ラジオボタンの初期化メソッド呼び出し 40 radioMarriage = initRadioMarrige(); 41 42 //ラジオボタン用のMapをModelに登録 43 model.addAttribute("radioMarriage",radioMarriage); 44 45 //signup.htmlに画面遷移 46 return "login/signup"; 47 } 48 49 //ユーザー登録画面のPOST用コントローラー 50 //ポイント2:データバインド結果の受け取り 51 @PostMapping("/signup") 52 public String postSignUp(@ModelAttribute @Validated(GroupOrder.class) SignupForm form, BindingResult bindingResult, Model model) { 53 //ポイント3:データバインド失敗の場合 54 //入力チェックに引っかかった場合、ユーザー登録画面に戻る 55 56 if(bindingResult.hasErrors()) { 57 58 //GETリクエスト用のメソッドを呼び出して、ユーザー登録画面に戻ります 59 return getSignUp(form,model); 60 } 61 62 //formの中身をコンソールに出して確認します 63 System.out.println(form); 64 65 //login.htmlにリダイレクト 66 return "redirect:/login"; 67 } 68} 69

java

1package com.example.demo.login.domain.model; 2import java.util.Date; 3 4import javax.validation.constraints.AssertFalse; 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; 11 12import org.hibernate.validator.constraints.Length; 13import org.springframework.format.annotation.DateTimeFormat; 14 15import lombok.Data; 16 17@Data 18public class SignupForm { 19 20 //必須入力、メールアドレス形式 21 @NotBlank(groups = ValidGroup1.class) 22 @Email(groups = ValidGroup2.class) 23 private String userId;//ユーザーID 24 25 //必須入力、長さ4から100桁まで、半角英数字のみ 26 @NotBlank(groups = ValidGroup1.class) 27 @Length(min=4,max=100,groups = ValidGroup2.class) 28 @Pattern(regexp="^[a-zA-Z0-9]+$",groups = ValidGroup3.class) 29 private String password;//パスワード 30 31 //必須入力 32 @NotBlank(groups = ValidGroup1.class) 33 private String userName;//ユーザー名 34 35 //ポイント:@DateTimeFormat 36 //必須入力 37 @NotNull(groups = ValidGroup1.class) 38 @DateTimeFormat(pattern = "yyyy/MM/dd") 39 private Date birthday;//誕生日 40 41 //値が20から100まで 42 @Min(value=20,groups = ValidGroup2.class) 43 @Max(value=100,groups = ValidGroup2.class) 44 private int age;//年齢 45 46 //falseのみ可能 47 @AssertFalse(groups = ValidGroup2.class) 48 private boolean marriage;//結婚ステータス 49} 50

java

1package com.example.demo.login.domain.model; 2 3import javax.validation.GroupSequence; 4 5 6@GroupSequence({ValidGroup1.class, ValidGroup2.class, ValidGroup3.class}) 7public interface GroupOrder { 8 9}

java

1package com.example.demo.login.domain.model; 2 3public interface ValidGroup1 { 4 5}

(ValidGroup2,3も同様に作っています)

properties

1typeMismatch.int=数値を入力してください 2typeMismatch.java.util.Date=yyyy/MM/dd形式で入力してください 3#フィールド名 4userId=ユーザーID 5password=パスワード 6userName=ユーザー名 7birthday=誕生日 8age=年齢 9 10#バリデーションエラーメッセージ 11NotBlank={0}は必須入力です 12 13Email={0}はメールアドレス形式で入力してください 14 15Length={0}は、{2}桁以上、{1}桁以下で入力してください 16 17Pattern={0}は半角英数字で入力してください 18 19NotBlank={0}は必須入力です 20 21NotNull={0}は必須入力です 22 23Min={0}は{1}以上を入力してください 24 25Max={0}は{1}以下を入力してください 26 27AssertFalse=falseのみ登録できます

html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4 <meta charset="UTF-8"></meta> 5 <!-- Bootstrapの設定 --> 6 <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel="stylesheet"></link> 7 <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> 8 <title>SignUp</title> 9</head> 10<body> 11 <div class="col-sm-5"> 12 <div class="page-header"> 13 <h1>ユーザー登録画面</h1> 14 </div> 15 <form method="post" action="/signup" th:object="${signupForm}"> 16 <table class="table table-borderd table-hover"> 17 <!-- ユーザーIDの入力エリア --> 18 <tr> 19 <th class="active col-sm-3">ユーザーID</th> 20 <td> 21 <!-- ポイント1:エラー用CSSの追加 --> 22 <div class="form-group" th:classappend="${#fields.hasErrors('userId')}? 'has-error'"> 23 <input type="text" class="form-control" th:field="*{userId}"/> 24 <!-- ポイント2:個別エラーメッセージの表示 --> 25 <span class="text-danger" th:if="${#fields.hasErrors('userId')}" th:errors="*{userId}">userId error</span> 26 </div> 27 </td> 28 </tr> 29 <!-- パスワードの入力エリア --> 30 <tr> 31 <th class="active">パスワード</th> 32 <td> 33 <div class="form-group" th:classappend="${#fields.hasErrors('password')}? 'has-error'"> 34 <input type="text" class="form-control" th:field="*{password}"/> 35 <span class="text-danger" th:if="${#fields.hasErrors('password')}" th:errors="*{password}">password error</span> 36 </div> 37 </td> 38 </tr> 39 <!-- ユーザー名の入力エリア --> 40 <tr> 41 <th class="active">ユーザー名</th> 42 <td> 43 <div class="form-group" th:classappend="${#fields.hasErrors('userName')}? 'has-error'"> 44 <input type="text" class="form-control" th:field="*{userName}"/> 45 <span class="text-danger" th:if="${#fields.hasErrors('userName')}" th:errors="*{userName}">userName error</span> 46 </div> 47 </td> 48 </tr> 49 <!-- 誕生日の入力エリア --> 50 <tr> 51 <th class="active">誕生日</th> 52 <td> 53 <div class="form-group" th:classappend="${#fields.hasErrors('birthday')}? 'has-error'"> 54 <input type="text" class="form-control" placeholder="yyyy/MM/dd" th:field="*{birthday}"/> 55 <span class="text-danger" th:if="${#fields.hasErrors('birthday')}" th:errors="*{birthday}">birthday error</span> 56 </div> 57 </td> 58 </tr> 59 <!-- 年齢の入力エリア --> 60 <tr> 61 <th class="active">年齢</th> 62 <td> 63 <div class="form-group" th:classappend="${#fields.hasErrors('age')}? 'has-error'"> 64 <input type="text" class="form-control" th:field="*{age}" /> 65 <span class="text-danger" th:if="${#fields.hasErrors('age')}" th:errors="*{age}">age error</span> 66 </div> 67 </td> 68 </tr> 69 <!-- 結婚ステータスの入力エリア --> 70 <tr> 71 <th class="active">結婚</th> 72 <td> 73 <div class="form-group" th:classappend="${#fields.hasErrors('marriage')}? 'has-error'"> 74 <!-- ポイント:ラジオボタンの実装 --> 75 <div th:each="item:${radioMarriage}"> 76 <input type="radio" name="radioMarrige" th:text="${item.key}" th:value="${item.value}" th:field="*{marriage}"></input> 77 <span class="text-danger" th:if="${#fields.hasErrors('marriage')}" th:errors="*{marriage}">marriage error</span> 78 </div> 79 </div> 80 </td> 81 </tr> 82 </table> 83 <!-- ポイント2:エラーメッセージの一覧表示 --> 84 <ul> 85 <li th:each="error:${#fields.detailedErrors()}"> 86 <span th:text="${error.message}">Error message</span> 87 </li> 88 </ul> 89 <!-- ユーザー登録ボタン --> 90 <button class="btn btn-primary" type="submit">ユーザー登録</button> 91 </form> 92 </div> 93</body> 94</html>

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/02 11:04

groups の設定のことなら 全項目の1がきえないと2の項目がでてこないのは仕様ですよ
Neru_K

2020/01/09 01:44

返信遅くなりましてすみません。 そういう仕様だったのですね汗 1の項目を全部埋めたら2が出てきたのを確認しました! わからずに延々迷うところでしたが教えていただき助かりました、ありがとうございました!
guest

回答1

0

自己解決

仕様により、グループ1を全部満たしたあとにグループ2に移る、ということを教えていただき解決しました。

投稿2020/01/09 01:49

Neru_K

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問