質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

<Spring Boot> 掲示板更新時のバリデーションの不具合

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 831
退会済みユーザー

退会済みユーザー

前提・実現したいこと

Spring Bootで掲示板を作成しています。
バリデーションを実装しようとしており、新規書き込み時に、入力欄が空白だった場合エラーメッセージを表示させることには成功しました。
ただ、書き込みされたものを編集する場合に、入力欄が空白だと以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

ava.lang.IllegalArgumentException: The given id must not be null!
    at org.springframework.util.Assert.notNull(Assert.java:198) ~[spring-core-5.1.5.RELEASE.jar:5.1.5.RELEASE]

該当のソースコード

    @RequestMapping("/disedit")
    public ModelAndView edit(ThreadsForm form) {
        ThreadsEntity threadsEntityList = service.getOne(form.getId());
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("threadsEntityList", threadsEntityList);
        modelAndView.setViewName("/View_edit.html");

        return modelAndView;
    }

    @RequestMapping("/edit")
    public ModelAndView edit(@ModelAttribute("form") @Valid ThreadsForm form, BindingResult result) {
        if (result.hasErrors()) {
            ModelAndView modelAndView = new ModelAndView("redirect:/disedit");
            modelAndView.addObject("form", form);

            return modelAndView;
        } else {
            service.updateDB(form.getId(), form.getCharacterName(), form.getSkillName());
            ModelAndView modelAndView = new ModelAndView("redirect:/home");

            return modelAndView;
        }
    }
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<link rel="stylesheet" href="/CSS.css" type="text/css">
<meta charset="UTF-8">
<title>H×H Characters Threads</title>
</head>
<body>
    <h1>Welcome to Hunter × Hunter Characters Threads</h1>
    <form method="POST">
        <div th:object="${threadsEntityList}">
            <p>
                ID : [[ *{id} ]]<input type="hidden" th:value=*{id} th:name="id">
            </p>
            <p>
                Name : <input type="text" th:value=*{name} th:name="characterName">
            </p>
            <div th:if="${form}" th:object="${form}">
                <label th:if="${#fields.hasErrors('characterName')}"
                    th:errors="*{characterName}"></label>
            </div>
            <p>
                Skill : <input type="text" th:value=*{skill} th:name="skillName">
            </p>
            <div th:if="${form}" th:object="${form}">
                <label th:if="${#fields.hasErrors('skillName')}"
                    th:errors="*{skillName}"></label>
            </div>
            <input type="submit" formaction="/edit" value="Update!">
        </div>
    </form>
</body>
</html>

試したこと

IDの値がnullで渡されている、というようなエラーなのですが、原因が全く分かりません。

補足情報(FW/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

-1

Controllerを以下のように変更したら、正常に作動しました。

@RequestMapping("/disedit")
public ModelAndView edit(ThreadsForm form) {
ThreadsEntity threadsEntityList = service.getOne(form.getId());
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("threadsEntityList", threadsEntityList);
modelAndView.setViewName("/View_edit.html");

return modelAndView;
}

@RequestMapping("/edit")
public ModelAndView edit(@ModelAttribute("form") @Valid ThreadsForm form, BindingResult result) {
if (result.hasErrors()) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("form", form);
ThreadsEntity threadsEntityList = service.getOne(form.getId());
modelAndView.addObject("threadsEntityList", threadsEntityList);
modelAndView.setViewName("/View_edit.html");

return modelAndView;
} else {
service.updateDB(form.getId(), form.getCharacterName(), form.getSkillName());
ModelAndView modelAndView = new ModelAndView("redirect:/home");

return modelAndView;
}
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る