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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

Q&A

解決済

1回答

1297閲覧

spring バリデーション に関して

encho

総合スコア182

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

0グッド

0クリップ

投稿2020/02/23 00:50

編集2020/02/23 00:59

##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,ユーザ名の長さのバリデーション が効かない)
イメージ説明

エラーが表示されないだけではなく
実際に登録もできてしまいます。
アドバイスをいただけると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

仕様です。

group の指定はその group がすべて正常に終わらない限り次のグループに進みません。

方法

  1. バリデーションクラスを自作する

  2. 出力時に1番目のエラーを出力する(他の項目は未入力時はチェックされない点を利用する)

<div class="invalid-feedback" th:each="err,st : ${#lists.sort(#fields.errors('email'))}" th:text="${err}" th:if="${st.index == 0}">エラーメッセージが出力されます</div>

投稿2020/02/23 01:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

encho

2020/02/23 01:26

ご回答ありがとうございます。 DefaultGroupのバリデーション が終わらない限り,group1,group2へは進まないということですね。 私の理解不足で申し訳ないのですが方法2の部分があまり理解ができておりません。 この場合はGroupの指定などは行わずに上記の方法でエラーの出力を行うということでしょうか?
encho

2020/02/23 01:28

出力時に1番目のエラーを出力する(他の項目は未入力時はチェックされない点を利用する) というのはemailの部分であればEmptyの対するエラーをはじめに出力するということですよね? (他の項目は未入力時はチェックされない点を利用する)そしてここの部分でどのようなことを意味されているのかがわかっていません。 申し訳ありませんが、ご教示いただけると幸いです。
encho

2020/02/23 02:48

理解ができ、問題も方法2によって解決いたしました! 本当にありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問