LoginSignup
0
0

More than 1 year has passed since last update.

Spring ValidationとModelAttributeメモ

Posted at

はじめに

Springbootでバリデーションを表示させようとしたのですが、原因がわからず詰まったため
解決方法を備忘録として記載します。

環境

OS:macOS Big Sur 11.5.2
使用ブラウザ:GoogleChrome
Spring:2.5.4
Java:OpenJDK 11.0.2
DB:MySQL(AWSのRDS上で起動中)

やりたいこと

更新フォームにおいて、バリデーションを出力する。
※入力フォームではバリデーションの出力はできていた。

InquiryContoroller.java
 @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";
            }
           //省略
            } 
update.html
<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に下記の記述を追記するとの記載があったが、既に記載してあった。

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を下記の通り小文字に修正した。

InquiryContoroller.java
//省略
model.addAttribute("inquiryForm", inquiryForm);
update.html
<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}">
//省略

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0