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

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

ただいまの
回答率

88.58%

Springでデータバインドを実装しようとしたところ500Internal Server Errorが発生します。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 8,084

G-ym

score 16

 前提・実現したいこと

SpringBootを使ってWebアプリを制作しています。
登録画面にデータバインドを実装しようとしたところ
以下のエラーメッセージが発生しました。
どのようにすれば、正常に画面が表示されるのでしょうか。

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

画面上では以下のように、エラーメッセージが表示され

500Internal Server Error
An error happened during template parsing (template: "class path resource [templates/asset/regist.html]")


コンソールには以下のように、エラーメッセージが表示されました。

2018-11-14 20:02:52.998 ERROR 2848 --- [nio-8080-exec-2] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8080-exec-2] Exception processing template "asset/regist": An error happened during template parsing (template: "class path resource [templates/asset/regist.html]")

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/asset/regist.html]")
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) ~[thymeleaf-3.0.10.RELEASE.jar:3.0.10.RELEASE]
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) ~[thymeleaf-3.0.10.RELEASE.jar:3.0.10.RELEASE]
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) ~[thymeleaf-3.0.10.RELEASE.jar:3.0.10.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) [thymeleaf-3.0.10.RELEASE.jar:3.0.10.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) [thymeleaf-3.0.10.RELEASE.jar:3.0.10.RELEASE]
    at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) [thymeleaf-spring5-3.0.10.RELEASE.jar:3.0.10.RELEASE]
    at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) [thymeleaf-spring5-3.0.10.RELEASE.jar:3.0.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1325) [spring-webmvc-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1069) [spring-webmvc-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008) [spring-webmvc-5.0.10.RELEASE.jar:5.0.10.RELEASE]
...

 該当のソースコード

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <div th:fragment="regist_contents">
        <div class="page-header">
            <h1>資産登録</h1>
        </div>
        <form method="post" th:action="@{/assetRegist}" th:object="${AssetRegistrationForm}">
            <table class="table table-bordered table-hover">
                <tr>
                    <th class="active col-sm-3">名前</th>
                    <td>
                        <div class="form-group">
                            <input type="text" class="form-control" th:field="*{assetName}">
                        </div>
                    </td>
                </tr>
                <tr>
                    <th class="active">購入月</th>
                    <td>
                        <input type="text" class="form-control" placeholder="yyyy/MM/dd" th:field="*{purchaseDate}">
                    </td>
                </tr>
                <tr>
                    <th class="active">予定使用期間(月)</th>
                    <td>
                        <input type="text" class="form-control" th:field="*{usedTerm}">
                    </td>
                </tr>
            </table>
            <button class="btn btn-primary" type="submit">資産登録</button>
        </form>
    </div>
</body>

</html>
import java.util.Date;

import lombok.Data;

@Data
public class AssetRegistrationForm {
    private String assetName;
    private Date purchaseDate;
    private int usedTerm;
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import com.example.demo.asset.domain.model.Asset;
import com.example.demo.asset.domain.model.AssetRegistrationForm;
import com.example.demo.asset.domain.service.AssetService;

@Controller
public class AssetRegistrationController {

    @Autowired
    AssetService assetService;

    @GetMapping("/assetRegist")
    public String getAssetRegistration(@ModelAttribute  AssetRegistrationForm form,Model model) {
        model.addAttribute("contents", "asset/regist :: regist_contents");
        return "asset/regist";
    }

    @PostMapping("/assetRegist")
    public String postAssetRegistration(@ModelAttribute @Validated AssetRegistrationForm form,BindingResult bindResult,Model model) {
        model.addAttribute("contents", "asset/regist :: regist_contents");
        if (bindResult.hasErrors()) return getAssetRegistration(form,model);
        System.out.println(form);
        Asset asset = new Asset();
        asset.setAssetName(form.getAssetName());
        asset.setPurchaseDate(form.getPurchaseDate());
        asset.setUsedTerm(form.getUsedTerm());
        try {
            boolean result=assetService.insert(asset);
            if (result) {
                System.out.println("inset成功");
            }else {
                System.out.println("inset失敗");
            }
        } catch (DataAccessException e) {
            System.out.println("inset失敗(エラー)");
        }
        return "asset/regist";
    }

}

 試したこと

エラーメッセージで検索しましたが有益な情報はありませんでした。
HTMLのformタグに囲まれている部分をコメントアウトしたときには、エラーが出ませんでした。

以上よろしくお願いしします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

HTMLテンプレートの、th:objectで指定しているオブジェクトに微妙な誤りがあります。

<form method="post" ....... th:object="${assetRegistrationForm}">

なお、Thymeleafのテンプレート解析中のエラーは、たいていの場合、エラーが検出されたHTMLの行番号、列番号も表示されます。

今回のケースでは

Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "asset/regist" - line 26, col 69)

などが出るかと思われます。

原因はControllerの引数で指定している 

@ModelAttribute AssetRegistrationForm form

が、Modelやリクエスト属性へバインドしていない場合は、Spring側がModelAttributeに指定しているクラスを(デフォルトの設定では)クラス名で参照できるようになりますが、その時の名前はキャメルケースになります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/14 23:02

    解決できましたありがとうございます!

    キャンセル

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

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

関連した質問

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