はじめに
Springbootでバリデーションを表示させようとしたのですが、原因がわからず詰まったため
解決方法を備忘録として記載します。
環境
OS:macOS Big Sur 11.5.2
使用ブラウザ:GoogleChrome
Spring:2.5.4
Java:OpenJDK 11.0.2
DB:MySQL(AWSのRDS上で起動中)
やりたいこと
更新フォームにおいて、バリデーションを出力する。
※入力フォームではバリデーションの出力はできていた。
@GetMapping("/{id}")
public String showUpdate(
InquiryForm inquiryForm,
@PathVariable int id,
Model model){
//省略
model.addAttribute("inquiryForm", inquiryForm);
List<Inquiry> list = inquiryService.getAll();
model.addAttribute("list", list);
model.addAttribute("inquiryId", id);
model.addAttribute("title", "更新用フォーム");
return "inquiry/update";
}
@PostMapping("/update")
public String update(
@ModelAttribute @Validated InquiryForm inquiryForm,
BindingResult result,
@RequestParam("inquiryId") int inquiryId,
Model model,
RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
model.addAttribute("InquiryForm", inquiryForm);
model.addAttribute("inquiryId",inquiryId);
model.addAttribute("title", "更新用フォーム");
return "inquiry/update";
}
//省略
}
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<h1 th:text="${title}">更新用フォーム</h1>
<p th:if="${complete}" th:text="${complete}"></p>
<form method="post" action="#" th:action="@{/inquiry/update}" th:object="${InquiryForm}">
//省略
エラー内容
バリデーションが出力されない。
調査
①バリデーションについてGoogleで調べる
pom.xmlに下記の記述を追記するとの記載があったが、既に記載してあった。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
②改めて、ソースコードに間違いがないか確認する。
コントローラー、htmlをともに確認したが誤った記載を見つけることができなかった。
③テラテイルで質問する。(最終手段)
原因
@ModelAttributeアノテーションは、名前を指定しない場合、先頭小文字のクラス名(inquiryForm)で名前解決されることを知らなかった事。
つまり、InquiryContoroller.javaのshowupdateメソッドとupdateメソッドにおいてmodel.addAttributeを利用する際に先頭文字を大文字(InquiryForm)にしている事が原因であった。
解決策
InquiryContoroller.javaのshowupdateメソッドとupdateメソッド及びupdate.htmlを下記の通り小文字に修正した。
//省略
model.addAttribute("inquiryForm", inquiryForm);
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<h1 th:text="${title}">更新用フォーム</h1>
<p th:if="${complete}" th:text="${complete}"></p>
<form method="post" action="#" th:action="@{/inquiry/update}" th:object="${inquiryForm}">
//省略
参考