はじめに
日付の入力値を検証する際、java.sql.Timestamp型 を使用すると
BindingResultでは意図しない影響を及ぼす事が判明したので備忘録として記載。
入力値を受け取るフォーム
DateMoldForm.java@Data @NoArgsConstructor public class DateMoldForm { private Timestamp timestampMold; private LocalDateTime datetimeMold; public DateMoldForm(VerificationDateMold entity) { this.timestampMold = entity.getTimestamp_mold(); this.datetimeMold = entity.getDatetime_mold(); }
影響について
必須入力ではない、日付を空文字で登録した場合Timestamp型ではエラーが発生する。
これはアノテーションによるチェックではなく
フォームから送信された値をコントローラーのオブジェクトにバインド(型変換)する際に失敗しており、BindingResultでは型変換失敗のエラーも含んでいる事が分かりました。
※String→Timestampに型変換するConverterは存在しませんでした。
https://docs.spring.io/spring-framework/docs/4.2.0.RC2_to_4.2.0.RC3/Spring%20Framework%204.2.0.RC3/index.html?org/springframework/core/convert/support/package-summary.html
必須入力ではないためでチェック対象から外す。
解決策として@DateTimeFormatアノテーションを付与。
引数に日付フォーマットを指定し挙動に問題がないかを確認する。
@DateTimeFormat の確認
DateMoldFormを修正し、登録ボタンを押下し結果を確認する。
DateMoldForm.java@Data @NoArgsConstructor public class DateMoldForm { @DateTimeFormat(pattern = "yyyy-MM-dd") private Timestamp timestampMold; @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDateTime datetimeMold; public DateMoldForm(VerificationDateMold entity) { this.timestampMold = entity.getTimestamp_mold(); this.datetimeMold = entity.getDatetime_mold(); } }
結果
エラーは発生しなくなったが、Timestamp型が NULL で登録されている事が分かりました。
java.sql.Timestamp 、 java.time.LocalDateTime は
バリデーションだけではなく@DateTimeFormatを付与して登録する場合も影響を及ぼす事が分かりました。
MariaDB [spring_practice]> select * from verification_date_mold;
+---------------------+---------------+
| timestamp_mold | datetime_mold |
+---------------------+---------------+
| 2024-10-02 19:12:07 | NULL |
+---------------------+---------------+
以上。