-
Notifications
You must be signed in to change notification settings - Fork 73
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rejected Valueの表示メカニズムの提供 #47
Comments
代替案2: (従来通り)ドメインオブジェクトにソーステキストを持たせる (boolean validによって出しわけはなくす?) 代替案3: ドメインオブジェクトではなく、DTO(フォームオブジェクト)にする |
バリデーションの失敗時に、拒否された入力値をフォームに表示する、などを行ってみたコードです。 |
rejectedValueの扱いの結論を要約すると、 (1)rejectedValue をモデルが持つ必要はない Spring MVC の model オブジェクトが、入力内容を保持している。hasErrors のときのビューを表示するために、ドメインオブジェクトを渡す必要はない。 (2) 数値や日付へのバインディング 文字列を一つ持つコンストラクタを宣言した値オブジェクトを使う。 エラーメッセージは、メッセージ定義ファイルに、 typemismatch.型名のフルパスを記述するばOK。 (3)結論 ドメインオブジェクトは、rejectedValue や、invalid なスタータスについて、何もコードを書く必要はない。 hasErrors のときに、model に何か addAttributeする必要はない。 ようするに、rejectedValue は、コンストラクタで型変換を試みて、失敗したときにTypemismatchException を返すことだけを記述すれば、その他の記述は不要。 |
@irof さんのサンプルは、Spring MVC デフォルトの getter/setter でした。 getter/setter の場合: direct field access の場合: Direct Field Access の場合も、getter/setter と同じ挙動にする方法はないか? |
${#fields.hasErrors(email*)}でエラー検知できないですかね? |
エラーメッセージの表示はそれでいけます。 |
JSUGの大野さんに調べてもらい、意見交換した結果。 状況: th:field で指定したバインドパスが、バリデーションエラーを起こしているかの判定ロジックは以下のメソッド AbstractErrors#isMatchingFieldError(String field, FieldError fieldError) ここで、th:field:age の指定だと、age.age のエラーを検知できない。 結論: th:field も age.age を指定するようにする バインディングの型変換の問題は、以下で対応 int ではなく Integer を使う ( デフォルトの表示を0ではなく、空白にするため) バインディング時に特殊な加工(どんな?)が必要な場合は、property editor の追加で対応することを検討する。 という方向で、isolating-the-domain のサンプルを書き直す 当初の目的である、reject value の心配ごとは、MVC側に任せることは、この方法で実現できる。 view の記述が若干冗長になるが、 th:field と th:errors のパス記述が一致するメリットはある。 いったんクローズ |
バリデーションの失敗時に、拒否された入力値をフォームに表示する仕組みを、ドメイン層のクラスから取り除きたい
概要:
ドメインオブジェクトに、不正な入力値を保持したくない
(ドメインオブジェクトにバリデーション時の不正値を扱うコードを書きたくない)
背景:
th:field でバインディングした場合、不正値を再表示するためには、ドメインオブジェクトが入力された文字列を持ち、バリデーション結果を持ち、toString()で、表示内容を変える仕組みを記述している。
このためのコードは、本来、ビューで解決すべき内容であり、ドメインオブジェクトを不適切に汚染している。
解決案:
th:field ではなく、
th:id, th:name, th:value を明示的に使う
th:value で FieldError#getRejectedValue()を表示する
効果/目標:
ドメインオブジェクトからバリデーションの不正入力値を扱うコードを取り除く
Thymeleafのテンプレートの記述を「できるだけ」簡潔にする
代替案1:
Thymeleafではなく、JavaScriptで実現する
仕組みが複雑になり、可読性、保守性に問題が多い
留意事項
・Thymeleaf の用意している拡張の仕組みの利用を検討
http://www.thymeleaf.org/doc/tutorials/2.1/extendingthymeleaf.html
・BindingResultから、FieldErrorsあるいは、RejectedValuesを、テンプレートに渡す方法
・公開されたレポジトリでの提供(依存性解決)
The text was updated successfully, but these errors were encountered: