##詰まっている点
Tymeleafでバリデーション を行いたいのですが、バリデーションが適用されません。
やっていること
Todoリストを作成していて、タイトルと期限を入力して登録する場面でタイトルのバリデーション を行いたいです。
バリデーションの内容はformに記述し、コントローラ で@validしています。
分からないこと
- TodoController でbindingResult.hasErrors()で、常に Trueになってしまう
- index.htmlでフィールドエラーを出力しているはずなのに、何も表示されない
- formのバリデーション を行う/registerではなく、Todo一覧を表示する場合の/(ページを表示するだけ)でもなぜかformをmodelAttributeしないとエラーになってしまう
3つ目の質問は自分の知識不足で、そのようなルールなのかもしれませんが、直感的に受け入れ切れてないという感じです。
1つ目と2つ目が分からないことで、3つ目に関してはどのように理解すれば良いか、お答えいただけたら幸いです。
TodoForm
1public class TodoForm { 2 // ここでバリデーションを定義 3 @Size(min = 1, max = 31) 4 private String title; 5 6 private java.time.LocalDate deadLine; 7 8 public String getTitle() { 9 return title; 10 } 11 12 public void setTitle(String title) { 13 this.title = title; 14 } 15 16 public java.time.LocalDate getDeadLine() { 17 return deadLine; 18 } 19 20 public void setDeadLine(java.time.LocalDate deadLine) { 21 this.deadLine = deadLine; 22 } 23}
TodoController
1 2 @RequestMapping(value = "/", method = RequestMethod.GET) 3 public String index(@ModelAttribute("form") TodoForm form, Todo todo, Model model) { 4 model.addAttribute("todoList", todoService.selectAll()); 5 return "index"; 6 } 7 8 @RequestMapping(value = "/register", method = RequestMethod.POST) 9 public String create(@Validated TodoForm form, BindingResult bindingResult, Todo todo) { 10 if (!bindingResult.hasErrors()) { 11 todoService.save(todo); 12 } 13 return "redirect:/"; 14 }
index.html
1 <form th:action="@{/register}" th:object="${form}" method="post"> 2 <div class="addContent"> 3 <span>新しいTodoを作成する</span> 4 <br> 5 <span>Todo名</span> 6 <input type="text" th:field="*{title}"/> 7 <span th:if="${#fields.hasErrors('title')}" th:errors="*{title}">Name error</span> 8 <br> 9 <span>期限</span> 10 <input type="date" th:field="*{deadLine}"/> 11 12 </div> 13 <input type="submit" value="ToDoの追加" id="addButton"/> 14 </form>
環境
項目 | バージョン |
---|---|
Java | 11 |
Spring Boot | 2.2.6 |
Thymeleaf | spring-boot-starter-thymeleaf |
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー