Open gitRock2016 opened 4 years ago
・チェックを何するか設計する。とりあえず必要最低限のみ Formクラス
最低限なので、以下画面を対象に行う
・単項目チェックの実装(Formクラス)
状況 Formにアノテーションで指定し、CotrollerでBindingresultを引数で受け取るようにした チェック結果は格納されているが、画面にチェック結果のメッセージを表示できない ※Hibernate Validatorによるチェックなので、Hibernateのメッセージが設定される認識 ⇒ ModelにFormをマッピングするキーをForm名称と同じにすると、Tyhmeleaf側で取得できた。
・単項目チェックをの実装
単項目チェック WFSで実装していたやりかた https://qiita.com/NagaokaKenichi/items/65d0e07151292968d67f
MVCでの単項目チェック https://qiita.com/kenhori/items/4534f548bbee5bfb6064
相関チェック アノテーションを使うやりかた https://arakan-pgm-ai.hatenablog.com/entry/2017/04/08/003859
・単項目チェックの実装 ⇒対応中(詳細部がまだ ・不要なファイルを整理して単項目チェックが出るまでの経路を整理する ⇒完了 ・実装する、メッセージを独自にしたければ実装する 日本語化する フィールド名の表示 ⇒完了 ・相関チェックのサンプル実装を行う ⇒未着手
http://ziqoo.com/wiki/index.php?Spring%20Boot%20%C6%FE%CE%CF%A5%C1%A5%A7%A5%C3%A5%AF th:if="${#fields.hasErrors('name')}" 参考ソースはth:ifを利用しているが、別になくても挙動は変わらない ある・なしで動作確認した
もともと表示されている要素にエラー用にと以下属性を追加すると表示がきえる 多分チェックエラー時だけ表示するようにしているのだと思う。
th:if="${#fields.hasErrors('trainingStartTime')}"
th:errors="*{trainingStartTime}"
・th:errorsを利用する、if:は使わない ・エラー時の色づけはth:errorclassを利用する、CSSは共通でつくりインポートする メッセージ ・ロケールを意識してmessages_ja.propertiesにメッセージを格納する
・src/main/resouces直下に「messages.properties」を格納すると自動で読み込む ・日本語専用ファイル(messages_ja.properties)を読み込みたい場合は、application.proreptiesに以下を指定する (messages.propretiesファイルは利用しなくても存在しないとメッセージがバグる)
spring.messages.basename=messages
・Hibenateのチェック、メッセージはmessages.propertiesでなくValidationMessages.propertiesに定義しないと変更できない ・Hibenateのチェック、メッセージファイルの格納先はmessagesと同じでよい。ロケールのためxxx_jaというファイルを作成して読み込んでくれる ・MessageResouceクラスはmessagesファイルから読み込む ・HibenateのチェックはValidationMessagesファイルから読み込む (フィールド名の定義は読み込めない)
メッセージ参考 https://qiita.com/sukezane/items/66b70382492d32539b3e https://www.shookuro.com/entry/2018/07/22/140211
・単項目チェックの実装(詳細部)
・単項目チェックの実装(詳細部)
単項目チェック時に例外が発生する
Field error in object 'trgRecordListRegistEditForm' on field 'detailForms[2].weight':
原因分析 ・デバッグするとコントローラでチェック結果は取得できている ・htmlがコントローラからチェック結果を取得する際に処理に失敗しているよう
対応 ネスト項目なので、エラー対象の要素指定が上手くいっていないのではと考え、プリプロセッサ指定したが、例外が発生する
<span th:if="${#fields.hasErrors('detailForms[__${stat.index}__].count')}"
th:errors="*{detailForms[__${stat.index}__].count}" style="color: red"> </span>
参考サイトの記載をまねるとうまくいった。 https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/Validation.html#bean
ネストでエラー処理を書く際に、th:objectを利用する形で、th:errorsを利用すると例外が発生する。 th:objectを利用せず、全体をプリプロセッサで記載すると上手くいった。 内部処理が不明なので、詳細な原因は不明。
例外が発生する(inputタグではエラーしていない)
<tr th:each="row, stat : *{detailForms}" th:object="${row}">
<!-- ※処理の記載を中略 -->
<td class="col-xs-6 col-md-5">
<input type="number" th:value="*{count}" th:name="${'detailForms[' + stat.index + '].count' }" step="0.01">
<span th:errors="*{count}" style="color: red"></span>
成功
<tr th:each="row, stat : *{detailForms}" th:object="${row}">
<!-- ※処理の記載を中略 -->
<td class="col-xs-6 col-md-5">
<input type="number" th:value="*{detailForms[__${stat.index}__].count}" th:name="${'detailForms[' + stat.index + '].count' }" step="0.01">
<span th:errors="*{count}" style="color: red"></span>
・ネストしたバリデーション結果のメッセージに、物理名でなく日本語名をだしたい
工数2.0H
エラーメッセージのフィールド名が、ネスト項目でも変更できるようにする。 →以下のように要素数まで含め指定した場合メッセージが取得できた。しかし汎用性がなさすぎる。
trgRecordListRegistEditForm.detailForms[0].weight=体重
なので、仕様を変更する。 ・ネスト項目に対する必須チェックのValdationメッセージにはフィールド名を出力しない ・ネスト項目に対する必須チェック時のValidationメッセージをデフォルトから変更する
Hibenateのデフォルトメッセージ(ValidationMessages)の変更
「detailForms」というフィールド名で指定されたクラスがもつweightフィールドに対する、必須チェック(NotBlank)のメッセージを変更する場合、「messages_ja.properties」に以下の形式でメッセージを定義する
NotBlank.detailForms.weight=必須です
※
TrgRecordListRegistEditForm
∟ List
参考
アノテーション名.フォーム属性名.プロパティ名=対象のメッセージ https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/Validation.html#validation-message-def
・相関チェックを実装する
チェック仕様を見直す。 使い勝手を考慮し、すべて空のkgと回数があっても入力OKとする。 ※今はkgと回数が空の組み合わせがあると登録できず、その項目は削除する必要がある トレーニング中にいちいち削除するのは、手間なのでチェックを変える
1.チェックを追加する
・トレーニング詳細の項目(kgと回数)は、すくなくとも1項目、入力されていなければならない
・トレーニング詳細は相関チェック
kgが入力されていれば、回数が入力されていなければならない
回数が入力されていれば、kgが入力されていなければならない
2.以下の必須チェックは削除する、ただし勉強結果としてコメントアウトで残す トレーニング詳細の項目、kgと回数は入力必須
3.DBに登録する際は、kgと回数が空のデータは登録させない
・初期表示時今の日付が、mappingされない。devブランチとissNo8が漏れがあるので、マージする
今MslMgtで利用しているBeanValidationの仕組みを概要でいいので理解したい 例えば、BeanValidationとは?仕様で実装がHibenateValidaterに当たるのは知ってるが、それだけしか知らない。
2130-2400
http://localhost:18989/MslMgt/
・相関チェックを実装する
特定Fromに対する相関チェックの場合は、Validatorインターフェースを実装する方針がよい
実装したが相関チェックエラーが表示されない Controllerが呼び出された際に、BindingResultにエラーがない → ・バリデータがよびだされていない? ・チェック処理がエラーの箇所を走っていない? ・ネスト項目だからうまく呼び出されない ※調査中
・相関チェックエラーが出ない原因をしらべる ・ネストされていない項目に対して実装して、うまくチェックできるか確認する ・FormにAssertTrueでできちゃわないか?(https://qiita.com/t-iguchi/items/ea3dd8691d52d7abe695
・アノテーションの使い方や仕組みを知るとよい ネットで調べたときに未知のアノテーションが利用されていることがある アノテーションの仕組みを知っていれば、何となくの理解ができると思えるため
http://ziqoo.com/wiki/index.php?Spring%20Boot%20%C6%FE%CE%CF%A5%C1%A5%A7%A5%C3%A5%AF#l151a1e9
アノテーション分析して違いを動作確認しておきたい
https://spring-boot-doma2-sample.readthedocs.io/ja/master/validation.html
spring-webmvc:5.2.2
2330-2500
・相関チェックエラーが出ない原因をしらべる ・ネストされていない項目に対して実装して、うまくチェックできるか確認する
確認できた →アノテーションの付け忘れで躓いた、aho
・FormにAssertTrueでできちゃわないか?(https://qiita.com/t-iguchi/items/ea3dd8691d52d7abe695
未着手
Validatorインターフェースのsupports実装する際にネスト項目なので、List
参考
相関チェックの実装について
Binderについて
0630-0700
Validatorインターフェースのsupports実装する際にネスト項目なので、Listにキャストする形で実装して試してみる。 (最大1.5時間)
ValidatorインターフェースのsupportsメソッドでList<>.classがコンパイルエラーする
だめなら、FormにAssertTrueのやり方で実装する またそれでも難しければ、チェック処理を自前で作成する
AssertTrueでエラーメッセージ出すときの書き方memoする
・チェックを何するか設計する。とりあえず必要最低限のみ Formクラス ・単項目チェックの実装(Formクラス) ・相関チェックの実装(バリデータ)