gitRock2016 / MslMgt

0 stars 0 forks source link

チェック(単項目、相関)を各画面にいれたい #8

Open gitRock2016 opened 4 years ago

gitRock2016 commented 4 years ago

・チェックを何するか設計する。とりあえず必要最低限のみ Formクラス ・単項目チェックの実装(Formクラス) ・相関チェックの実装(バリデータ)

gitRock2016 commented 4 years ago

20190315

やったこと

・チェックを何するか設計する。とりあえず必要最低限のみ 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

gitRock2016 commented 4 years ago

20200320

やったこと

・単項目チェックの実装 ⇒対応中(詳細部がまだ ・不要なファイルを整理して単項目チェックが出るまでの経路を整理する ⇒完了 ・実装する、メッセージを独自にしたければ実装する 日本語化する フィールド名の表示 ⇒完了 ・相関チェックのサンプル実装を行う ⇒未着手

http://localhost:18989/MslMgt

やること(詳細)

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にメッセージを格納する

整理

springbootでのメッセージの出し方

・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

TODO

・単項目チェックの実装(詳細部)

gitRock2016 commented 4 years ago

20200328

やったこと

・単項目チェックの実装(詳細部)

単項目チェック時に例外が発生する

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>

参考

TODO

・ネストしたバリデーション結果のメッセージに、物理名でなく日本語名をだしたい

gitRock2016 commented 4 years ago

0329

工数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

TODO

・相関チェックを実装する

gitRock2016 commented 4 years ago

0422

やったこと

チェック仕様を見直す。 使い勝手を考慮し、すべて空のkgと回数があっても入力OKとする。 ※今はkgと回数が空の組み合わせがあると登録できず、その項目は削除する必要がある  トレーニング中にいちいち削除するのは、手間なのでチェックを変える

TODO

1.チェックを追加する ・トレーニング詳細の項目(kgと回数)は、すくなくとも1項目、入力されていなければならない ・トレーニング詳細は相関チェック
kgが入力されていれば、回数が入力されていなければならない 回数が入力されていれば、kgが入力されていなければならない

2.以下の必須チェックは削除する、ただし勉強結果としてコメントアウトで残す  トレーニング詳細の項目、kgと回数は入力必須

3.DBに登録する際は、kgと回数が空のデータは登録させない

・初期表示時今の日付が、mappingされない。devブランチとissNo8が漏れがあるので、マージする

気になる

今MslMgtで利用しているBeanValidationの仕組みを概要でいいので理解したい 例えば、BeanValidationとは?仕様で実装がHibenateValidaterに当たるのは知ってるが、それだけしか知らない。

gitRock2016 commented 4 years ago

0425

やったこと

2130-2400

http://localhost:18989/MslMgt/

・相関チェックを実装する

特定Fromに対する相関チェックの場合は、Validatorインターフェースを実装する方針がよい

https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/ArchitectureInDetail/Validation.html#validation-correlation-check

binderについて https://sites.google.com/site/soracane/home/springnitsuite/spring-mvc/08-binderno-chu-qi-huanitsuite-parametakaramoderuheno-xing-bian-huan

実装したが相関チェックエラーが表示されない Controllerが呼び出された際に、BindingResultにエラーがない → ・バリデータがよびだされていない? ・チェック処理がエラーの箇所を走っていない? ・ネスト項目だからうまく呼び出されない ※調査中

TODO

・相関チェックエラーが出ない原因をしらべる  ・ネストされていない項目に対して実装して、うまくチェックできるか確認する  ・FormにAssertTrueでできちゃわないか?(https://qiita.com/t-iguchi/items/ea3dd8691d52d7abe695

気になる

SpringBootを学ぶ上での事前知識

・アノテーションの使い方や仕組みを知るとよい  ネットで調べたときに未知のアノテーションが利用されていることがある  アノテーションの仕組みを知っていれば、何となくの理解ができると思えるため

アノテーションで相関チェックをつくる

http://ziqoo.com/wiki/index.php?Spring%20Boot%20%C6%FE%CE%CF%A5%C1%A5%A7%A5%C3%A5%AF#l151a1e9  

javax.validation.Valid or Spring’s @Validated の違いって?

アノテーション分析して違いを動作確認しておきたい

アノテーションの作成について役に立ちそう

https://spring-boot-doma2-sample.readthedocs.io/ja/master/validation.html

MSlMgtのミドルウェアのバージョンをメモする

spring-webmvc:5.2.2

gitRock2016 commented 4 years ago

0429

やったこと

2330-2500

・相関チェックエラーが出ない原因をしらべる ・ネストされていない項目に対して実装して、うまくチェックできるか確認する

確認できた →アノテーションの付け忘れで躓いた、aho

・FormにAssertTrueでできちゃわないか?(https://qiita.com/t-iguchi/items/ea3dd8691d52d7abe695

未着手

TODO

Validatorインターフェースのsupports実装する際にネスト項目なので、Listにキャストする形で実装して試してみる。(最大1.5時間) だめなら、FormにAssertTrueのやり方で実装する またそれでも難しければ、チェック処理を自前で作成する

参考

相関チェックの実装について

Binderについて

gitRock2016 commented 4 years ago

0514 wip

0630-0700

Validatorインターフェースのsupports実装する際にネスト項目なので、Listにキャストする形で実装して試してみる。 (最大1.5時間)

ValidatorインターフェースのsupportsメソッドでList<>.classがコンパイルエラーする

だめなら、FormにAssertTrueのやり方で実装する またそれでも難しければ、チェック処理を自前で作成する

AssertTrueでエラーメッセージ出すときの書き方memoする