JavaのフレームワークSpring bootでBean バリデーションを実行した際にバリデーションが効かなかったのでいろいろと調べました。
やりたいこと
フロントで入力した値をList型のformでバインドして指定したフォーマット(@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm :ss"))の通りに値が入らなかったらエラーを出すという処理です。
コード
workUser.java
@Data
public class WorkUser {
private int id;
private String userName;
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")
private LocalDateTime startTime;
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")
private LocalDateTime finishTime;
private int workFlag;
@NotNull
private String message;
private String duration;
private LocalDate startDate;
private LocalTime StartTiming;
private LocalTime FinishTiming;
}
workUserForm.java
@Data
public class WorkUserForm {
@Valid
private List<WorkUser> userworkList;
}
UserPageController.java
@PostMapping("/mypage/changeRecord")
public String changeRecord(@Validated WorkUserForm form, Model model,BindingResult bindingResult,HttpServletRequest httpServletRequest) {
// 入力 チェック
if (bindingResult.hasErrors()) {
return getUserList(model, httpServletRequest, form);
}
//行いたい処理
}
上記の構成でフロントから来たList型の値のバリデーションをしようとしましたが以下のエラーが出てきました。
1 errors<EOL>Field error in object validation ...............
結論
BindingResult bindingResultはバリデーションを行いたいformの後につける必要がありました。
UserPageController.java
@PostMapping("/mypage/changeRecord")
public String changeRecord(@Validated WorkUserForm form, BindingResult bindingResult, Model model,HttpServletRequest httpServletRequest) {
//行いたい処理
}
感想
かなり盲点をついたエラーだと感じました。javaはさまざまなルールがありまだまだマスターするには時間が必要だと認識できました。
参考サイト