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

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

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

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

バリデーション

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

Eclipse

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

Spring Boot

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

Q&A

1回答

2191閲覧

バリデーションの表示方法について

aae_11

総合スコア178

Java

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

バリデーション

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

Eclipse

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

Spring Boot

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

3グッド

0クリップ

投稿2020/04/24 03:30

編集2020/04/24 05:26

spring bootを使用したバリデーション処理の実装について、お聞きしたいことがあります。

以下は、コントローラークラスの「InpurController.java」です。

@Controller public class InputController{ @GetMapping("/signUp") public String input(CheckRegister checkRegister,Model model){ return "signUp"; } @PostMapping(value = "/top",params="sign-up-form") public String signUpCheck(@Validated CheckRegister checkRegister,BindingResult error,Model model){ if(error.hasErrors()) { //System.out.println("22"); return "signUp"; } return "top"; } }

以下は、「CheckRegister.java」です

package com.example.demo; // import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; public class CheckRegister { @Size(min = 1,message = "名前を入力して下さい") @Size(max = 100,message = "名前の登録に失敗しました") private String name; @Size(min = 1,message = "メールアドレスを入力して下さい") @Size(min = 3,max=100,message = "メールアドレスの登録に失敗しました。") private String email; @Size(min = 1,message = "パスワードを入力して下さい。") @Size(min = 8,message = "パスワードは8文字以上を入力して下さい。") @Size(max = 100,message = "パスワードの登録に失敗しました") private String password; @Size(min = 1,message = "確認パスワードを入力して下さい") private String confirm_password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getConfirmPassword() { return confirm_password; } public void setConfirmPassword(String confirm_password) { this.confirm_password = confirm_password; } }

以下は、signUp.htmlです

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Boot de Bootstrap</title> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="stylesheet" media="all" th:href="@{/webjars/bootstrap/4.3.1/css/bootstrap.min.css}"/> <link rel="stylesheet" media="all" th:href="@{/css/signUp.css}"/> </head> <body th:object="${checkRegister}"> <div class="container"> <div class="row"> <div class="col-md-5 col-sm-8 top_element"> <ul> <li th:each="error : ${#fields.detailedErrors()}"> <span th:text="${error.message}">Error message</span> </li> </ul> <div class="bg-primary"> <p class="text-white text-center sign-up-title ">SIGN UP</p> </div> <div class="form_content"> <form method="post" th:action="@{/top}"> <div class="form-group"> <input type="text" name="name" placeholder="Name"> </div> <div class="form-group"> <input type="email" name="email" placeholder="Email"> </div> <div class="form-group"> <input type="password" name="password" placeholder="Password"> </div> <div class="form-group"> <input type="password" name="confirm_password" placeholder="ConfirmPassword"> </div> <button type="submit" class="btn btn-primary sign-up-btn" name="sign-up-form">Sign up</button> </form> </div> </div> </div> </div> <script type="text/javascript" th:src="@{/webjars/jquery/3.4.1/jquery.min.js}"></script> <script type="text/javascript" th:src="@{/webjars/bootstrap/4.3.1/js/bootstrap.min.js}"></script> </body> </html>

実行は、「Eclipse」より実行させ、getでのアクセスはブラウザに「http://localhost:8080/signUp」と打ち込み行いました。
解決した部分なのですが、signUp.htmlのform部分より、名前、パスワード、メールアドレス、確認パスワード、がpostにより送信され、エラーが存在した場合はsignUp.htmlにて表示さますが、CheckRegister.javaにて、行なったバリデーションに引っ掛かってしまった場合、全てのエラーメッセージが出力されてしまう点です。
仮に、全てのformの欄に何も入力せずに、「Sign Up」ボタンを押した場合、以下のメッセージが全て表示されます。

パスワードは8文字以上を入力して下さい。

パスワードを入力して下さい。
メールアドレスを入力して下さい
メールアドレスの登録に失敗しました。
名前を入力して下さい

そうではなく、何も入力されていない場合は、以下のメッセージのみを表示させるようにしたいです。

パスワードを入力して下さい。

メールアドレスを入力して下さい
名前を入力して下さい

こちらの解決方法がありましたら、教えて貰えましたら幸いです。

実行環境:
Eclipseのバージョン: Version: 2019-12 (4.14.0)
OS: MacOSMojave

追記
Qiitaの記事など、検索し調べてみましたが、解決に繋がる情報は載ってはいませんでした。
ちなみに、こちらもBeanValidationに関する記事ですが、載ってはいませんでした。
※過去質問も探しましたが、見つかりませんでした。

検索したキーワード「spring boot validation」「spring boot Beanvalidation」

toll_tree, mizu8520, newyee👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/24 03:47

とりあえず検索すればでてくるし、何度か回答してます。 また 1/3 が未解決のままですと解決する意思なしととられますよ
m.ts10806

2020/04/24 03:55

>こちらの解決方法がありましたら 「過去質問確認するか、もっときちんと調べてください」というアドバイスで良ければしますが。
m.ts10806

2020/04/24 04:03

asahina1979さん >1/3 が未解決のままですと 「低評価が集まったから」「指摘コメントがめんどくさいから」とかの理由で削除依頼してはねられたのを幾つかみたことがあります。 おそらく「削除リクエストは受け入れられなかった」旨は通知されてると思うのですけど、そのまま無視してる気がしますね。 半端に自己解決するとそちらに低評価集まるの分かってるんでしょう。(ガイドラインどこまで無視する気だ)
aae_11

2020/04/24 04:31

>とりあえず検索すればでてくるし、何度か回答してます。 検索したのですが、出て来なかったもので... なんて検索すれば出てきますか?
m.ts10806

2020/04/24 05:22

>検索したのですが、出て来なかったもので... なんと検索したかを出さずに聞くのは単なる怠慢です。 「検索したキーワード」「参考にした記事」がセットになって初めて「その人が調べた」ということが伝わります。 「調べたんですけど」って言われたら「なんて調べた?」って聞きますよ普通。(普通じゃない人なら知りません) だから聞き返される前に出しておけば「調べればでてくる」なんて言われない。糾弾もされない。自己防衛する気なしですか? 「手抜きだ」って何度も言ってるじゃないですか。まだわかんない?
m.ts10806

2020/04/24 06:12 編集

やっぱりドキュメント避けてますよね。 Qiitaのどんな評価高い記事より信頼性がある確実な情報源ですよ。
m.ts10806

2020/04/24 06:32

質問者さんへ なぜこの質問に高評価がつくと思いますか? 私には誰かの参考になるような素晴らしい質問には思えません。 まるで私への抗議のよう(私が突っ込んでない同レベルの質問にはついてないから) 不純ですよね。問題を積み重ねたいらしい。
guest

回答1

0

Spring bootって「Spring Framework」の中の1つで、Webアプリケーションに特化したものという認識です。なので、結局機能的には「Spring Framework」です。
検索条件に「boot」を入れると結構ノイズ出てきます。

Bootの機能を探すか、本体既存の機能を探すか
ここは見極める必要がありますが、バリデーションはBootなくても良いはずです。
なぜならバリデーションはWebに限った機能ではないから。

Validating Form Input

こういうときはどこの誰が書いたのか分からない古い記事より公式のドキュメント
もちろん今回の質問者のキーワードを利用しても出てきます。
何かの書籍を参照するにしても最新バージョンより新しいことなんてのはありえないので、公式ドキュメントで確認するのは絶対必須。
プログラミングするうえで公式ドキュメント抜かしては何もできません。

英語が辛い?Google翻訳で十分。

別に一字一句見る必要はなく、
コードもちゃんとあるのだから、そちらを確認し、固有名詞など強調されている語句前後を翻訳かけるだけでも十分いけます。

PHPにおけるLaravelのような公式ではないものの、有志が原文を頑張って日本語訳してくれたようなドキュメントは確かにあるけど、ほとんどが原文更新を待って追従したものだろうし、タイムラグは必ずある。

※Springで検索するとほぼ必ずと言っていいほどTERASOLUNAが出てくるけど、これはNTT DATAが独自拡張したものなのでSpring本体が提供していな機能もあるので注意

あとは考え方次第。発想次第。
UXにも繋がること。

「UX」という言葉が分かりづらかったら「自分が使ってたら”これなんか使いづらいな”」って思えば「UX的におかしい」と言える。

例えば「パスワードを入力して下さい。」と「パスワードは8文字以上を入力して下さい。」
これ、わける必要があるか?
どうせ8字以上入力しなきゃ受け付けないんだったら「パスワードは8文字以上を入力して下さい。」だけでいいと思いませんか?

サービスは使ってもらってこそ。
ここまで不親切なサービスは使われません。

「自分だったらどういう処理を内部でさせるか」仕様を考えてみてください。

@Size(min = 1,message = "パスワードを入力して下さい。") @Size(min = 8,message = "パスワードは8文字以上を入力して下さい。")

このように設定されていたら、1個ずつ上からチェックしますよね。
この2つの設定に連動性を持たせるような表現はどこにも書かれていません。

私ならこう書く(未検証)

@Size(min = 8,max = 100,message = "パスワードは8文字以上100字以下で入力して下さい。")

ユーザーも1回で「どうすればいいか」が分かります。

@Patternのほうが柔軟性は高いと思いますけど、正規表現使いこなせないと辛いので、要件次第で採用可否を決めてください。

ただ、バリデーションで使えるアノテーションは他にも@NotNullとか@NotEmptyとか@NotBlankとかそのままのキーワード(spring validation annotation)で調べれば出てきましたが、これらの採用は検討されなかったのでしょうか。

Spring自体もそうですが、それらが提供する機能もあくまで道具に過ぎません。
道具をどのように使うかは制作者の考え、発想次第。

多分もう1歩踏み込んで考えれば、良いキーワードで検索できるようになると思いますよ。

ほとんどの初心者はキーワードの選定の悪さが原因です。
検索して検索結果が出て、記事を読んで ってそんな何時間もかかるものではありません。
キーワードをどんどん変えて絞り込むなり切り替えるなりしていけばいい話と思います。

ただ、ドキュメントを避けていては、ほとんど進まないでしょうけどね。
あなたが作りたいものそのままを作ってる人なんてこの世界のどこにもいない。

要件を部品化するところから。
部品を集めるのも組み立てるのは他でもないあなた自身です。
他人に考えさせて他人に組ませたものは、もはや他人のものです。

余談

ちなみに、いろんな人といろんなプロジェクトで切磋琢磨してきましたが、
公式ドキュメントを参照しない人はそもそもの環境構築で躓きます。
で、「ビルド通らない」で何時間もかかって解決しない。
困り果ててメンバーに相談し、私もサポートに入るのですけど、私は公式ドキュメントの手順を参考にしバージョンもきちんとおさえて対応して、ものの数十分でビルド通るところまでいく
そういうことが良くあります。

何も魔法を使ったわけでもない。特別なことは何もしてない。
ただ単に公式ドキュメントの手順通りに1つずつやっていっただけ。
何ならほぼコピペです。
経験も何も関係ありません。
英語力もほとんど必要なく「Google翻訳で出力される日本語が理解できるレベル」であれば十分です。
有志の翻訳より分かりづらいですが、そこまで難解な訳にはなりません。大筋の把握には全く問題がないです。

同じですよ。
実務ですら解決できない人がいるのだから、
自称でも初心者の自覚がある人がドキュメントを確認せずにできるわけがないのです。

どちらがいいでしょうか?

どこかの誰かが書いた記事を何個も読んで何個も失敗してほぼ丸投げ状態で他人に頼って要件不明瞭調査不足で指摘されてくるか来ないか分からない回答を待つのと
公式のドキュメントを翻訳サービスに頼りながら読み解いていって確実に自分の身にするのと

少し考えてみてください。

投稿2020/04/24 06:06

編集2020/04/24 06:30
m.ts10806

総合スコア80875

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

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

m.ts10806

2020/04/24 08:57

もうちょっとしっかり読んでください。 全体の1割くらいしか読んでないようなコメントされても「もっとしっかり読んで」としか言えません。 答えだけ欲しがってどうするんですか。何も理解せずにコピペだけしてても身に付かないという話をしています。 >@Size(min = 8,max = 100,message = "パスワードは8文字以上100字以下で入力して下さい。") なぜ上記のような提案をするか、具体的に、順を追ってかみ砕いて書いてあります。 下記はどれくらい読みました? https://spring.io/guides/gs/validating-form-input/ なぜ「使用せずかわりに」と理解したのか私には分かりません。
aae_11

2020/04/24 11:58

>なぜ上記のような提案をするか、具体的に、順を追ってかみ砕いて書いてあります それは分かっています。 回答は全部読みました。 バリデーションに関しては、「@Size(min = 8,max = 100,message = "パスワードは8文字以上100字以下で入力して下さい。")」こちらで十分だったかもしれませんが、今回の質問の回答ではないと思います。 または、「https://spring.io/guides/gs/validating-form-input/」ここのページに解決方法が記載されているということですか?隅々まで目は通していないですが、バリデーションに関するチュートリアルのような説明だとは思いましたが。
m.ts10806

2020/04/24 12:01

そのままアドバイスが活きそうな質問を見つけました。 https://teratail.com/questions/210137 口調がよく似ています。アドバイスに対する理解度も近いので、反面教師になるのでは? 「実装方法」を考える前に考えるべきことが沢山あるということが伝わればいいのですけど。 仕様が整合性取れてなければ実装できないのも当然です。 おかしい仕様への対応までフレームワークはしてくれないでしょう。 どうしても入れたいなら自分で作るしかありませんが、 「そんな仕様、ユーザーは使いにくくて分かりにくくて仕方ないからこうしてはどうか」 というのが「私ならこうする」(フレームワークの設計思想にもそっている)です。 あとは、なぜそういう理解に至ったのか分からないので割愛。
m.ts10806

2020/04/24 12:53 編集

>それは分かっています。 悪いのですけど、分かってたらもう解決してます。 それくらいの内容で回答しています。 同じ種別の条件を縦に書くということはこうなっているということ。 if(length < 1){ } if(length < 8){ } これではlengthが0の時は両方満たしてしまいますよね。 でも質問者さんはプログラムでそう書いていますよね。書いた通り動いています。 この記述の中にはどこにも「最初の条件を満たしたこと」を連携させる情報を持っていません。 仕様的におかしいので、フレームワークでもそんなサポートはできません。 どうしてもそう書きたいというなら自分でロジック書くしかない。 そういうアノテーションを自分で作るしかない。(使う人がいるかは別) 考えるべきは「どう実現するか」ではないです。 そもそも、仕様がかたまっていない状態で実装方法だけ追っても矛盾や不整合が起きて今回のような混乱を引き起こすだけです。 それに「回答は全部読みました。」ならキーワード満載の下記をスルーしたのはなぜでしょう? -------------------引用開始 @Patternのほうが柔軟性は高いと思いますけど、正規表現使いこなせないと辛いので、要件次第で採用可否を決めてください。 ただ、バリデーションで使えるアノテーションは他にも@NotNullとか@NotEmptyとか@NotBlankとかそのままのキーワード(spring validation annotation)で調べれば出てきましたが、これらの採用は検討されなかったのでしょうか。 -------------------引用終了 ただ、いずれにしても「8文字以上入れないと通らない」という条件がある限り、どれを採用しても7文字以下(0含む)なら必ず「8文字以上入れないと通らない」が出るという、ユーザーアンフレンドリーな結果になります。 >バリデーションに関するチュートリアルのような説明だとは思いましたが。 おおよそその通り。「バリデーションで考慮すべきこと」は基本から学びなおさないといけません。考え方からです。 考え方が間違ってるのに実装も何もないですよ。 間違ってるなら正すところから。 間違っているところに対して無理やり合わせようとすると相乗的に間違った方向に突き進むことになります。 道に迷ったら元の道へ戻るのが基本です。 そのまま突き進んだらもっと迷うだけです。 迷ってるかすら分かってないのがはた目にも丸わかりなので、こちらは「まず立ち返るところから」というアドバイスに終始しているわけです。 オブラートに包まず表現するなら「こじらせてる」状態です。
aae_11

2020/04/24 23:44

validating -form-validateの記事を読んでいたのですが、「@NotNull」などのアノテーションが出てきました。 これっていうのはhibernatevalidatorでも搭載されていますが、これは元々なんのライブラリに実装されているものなのでしょうか?「https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface」 後「validating -form-validate」のURLには「spring.io」とありますが、これがspringbootで使えるのは、springbootがspringの機能を受け継いでいるからということでしょうか?
m.ts10806

2020/04/25 00:08 編集

Spring Boot が何者か知らずに使ってたとは思わなかった。 公式読んできてください。私が説明するよりも信頼できるでしょう。(回答に書いてるので結局回答読んでないってことをどんどん自らはいてるわけすが)
aae_11

2020/04/25 00:34

>「Spring Framework」の中の1つで、Webアプリケーションに特化したものという認識です。 これですよね? この説明では抽象的すぎると思いますが。
m.ts10806

2020/04/25 00:37

これで納得できないなら公式読んできてください。 あなたの感覚は知りませんが、Javaほぼ初心者でもおおよそこの表現で納得してもらえるので、納得できないなら知らないです。 どう説明しても分かってもらえないので困ってます(回答者がどんどん引いてます) ↓の質問者と全く同じです。 https://teratail.com/questions/210137
m.ts10806

2020/04/25 00:50 編集

全くオブラートに包まずに言うと「日本語が通じない」感覚です。 何に拘ってるのか分かりませんけど、そのまま説明しても納得できないなら自分で納得できる答えを勝手に見つけるしかありません。そしてそれは「道に迷ったところから戻らずに突き進む」ので余計に迷うだけ。でも気づかない。 「書いたように動く」と何度も言われてるかと思いますが、aae_11さんはずっと「思ったように動く」というスタンスを貫いています。 そりゃ、動きません。一生動くようになりません。 前に下記を紹介しましたが、読みました? https://megalodon.jp/2019-0105-0145-49/note.mu/kotofurumiya/n/n31d401fce782 タイトルだけで読むのをやめる人は本当にプログラミングやめたほうがいいと思う。 ちゃんと読んでいけばタイトルの意図も、自分がプログラミングをしていくためにどうしたらいいかも見えてくるはず。 aae_11さんに必要なのはSpringだJavaだWebだ、そういう次元ではないです。手法にだけ囚われて大事なことが何も見えてない。 包丁を正しく使えるようになるのは何のため?そういうところから理解しようとすらしていません。 プログラミングをしていく上での姿勢がteratailを利用している質問者でトップクラスにマズい。そこから改善しないことには何年たっても永遠に初心者未満です。
aae_11

2020/04/25 00:56

僕からも全てオブラートに包まず言うと、あなたはあまり人を教えるのには向いていないと思います。 自分で低評価がついているのは私怨でついてるとかなんとかって書いてたの見かけましたが、そもそもそんな恨まれるようなことしてたのかって話でありまして... 僕に粘着しているのを見てもちょっと常軌を逸していますね。
m.ts10806

2020/04/25 01:04 編集

では、1つでも2つでも回答してみると良いでしょう。 いや、本当に理解するなら100回は回答してみた方が良いですね。 ちょうど外出自粛で質問も増えてるし、1日5個で続ければ20日。 まあとりあえず10個でもいいです。1日2個で5日。今週中には達成できます。 それに私に「向いてない」と言えるほどのことをaae_11さんはしてるんでしょうか。 別にaae_11さんに「向いてない」と言われたところで、これまでの実績から「向いてない」と言い切れる人の方が少数派かと思います。自己評価ではなく数字です。 自分が理解できてないのを相手のせいにしてはいけません。 プログラムが動かないのをプログラムのせいにしてはいけません。
m.ts10806

2020/04/25 01:03

「読みました」と嘘を言ってはいけません。 プログラミングに最も必要なのは公明正大な精神です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問