「Spring解体新書」というテキストを参考にSpringの勉強をしているのですが、このエラーが出てしまい手も足も出ない状態です。
エラー
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/login/homeLayout.html]") at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] (文字数制限のため一部省略) Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.standard.processor.StandardIncludeTagProcessor' (template: "login/homeLayout" - line 48, col 22) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE] at org.attoparser.MarkupParser.parse(MarkupParser.java:257) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE] at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] ... 48 common frames omitted
homeLayoutの48行目でエラーが起こっているのは分かるのですが、ここからどのように対処すれば良いのか分かりません。
HomeController.java
import java.util.List; import java.util.Map; import java.util.LinkedHashMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import com.example.demo.login.domain.model.SignupForm; import com.example.demo.login.domain.model.User; import com.example.demo.login.domain.service.UserService; @Controller public class HomeController { @Autowired UserService userService; //結婚ステータスのラジオボタン用変数 private Map<String, String> radioMarriage; //ラジオボタンの初期化メソッド(ユーザー登録画面と同じ) private Map<String, String> initRadioMarriage(){ Map<String, String> radio = new LinkedHashMap<>(); //既婚、未婚をMapに格納 radio.put("既婚", "true"); radio.put("未婚", "false"); return radio; } @GetMapping("/home") public String getHome(Model model) { model.addAttribute("contents", "login/home :: home_contents"); return "login/homeLayout"; } //ユーザー一覧画面のGET用メソッド @GetMapping("/userList") public String getUserList(Model model) { model.addAttribute("contents", "login/userList :: userList_contents"); List<User> userList = userService.selectMany(); model.addAttribute("userList", userList); int count = userService.count(); model.addAttribute("userListCount", count); return "login/homeLayout"; } @GetMapping("/userDetail/{id:.+}") public String getUserDetail(@ModelAttribute SignupForm form, Model model, @PathVariable("id") String userId) { System.out.println("userId = " + userId); model.addAttribute("contents", "login/userDetail :: userDetail contents"); radioMarriage = initRadioMarriage(); model.addAttribute("radioMarriage", radioMarriage); if(userId != null && userId.length() > 0) { User user = userService.selectOne(userId); form.setUserId(user.getUserId()); form.setUserName(user.getUserName()); form.setBirthday(user.getBirthday()); form.setAge(user.getAge()); form.setMarriage(user.isMarriage()); model.addAttribute("signupForm", form); } return "login/homeLayout"; } @PostMapping("/logout") public String postLogout() { return "redirect:/login"; } @GetMapping("/userList/csv") public String getUserListCsv(Model model) { return getUserList(model); } }
homeLayout.html
HTML
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org" 3 xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> 4 5<head> 6 <meta charset="UTF-8"></meta> 7 8 <!-- Bootstrapの設定 --> 9 <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel="stylesheet"></link> 10 <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> 11 <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> 12 13 <!-- CSSの読込 --> 14 <link th:href="@{/css/home.css}" rel="stylesheet"></link> 15 16 <title>Home</title> 17</head> 18<body> 19 <!-- ===== ヘッダー(ナビゲーションバー) ===== --> 20 <nav class="navbar navbar-inverse navbar-fixed-top"> 21 <div class="container-fluid"> 22 <div class="navbar-header"> 23 <a class="navbar-brand" href="#">SpringSample</a> 24 </div> 25 <form method="post" th:action="@{/logout}"> 26 <button class="btn btn-link pull-right navbar-brand" type="submit"> 27 ログアウト 28 </button> 29 </form> 30 </div> 31 </nav> 32 <!-- ===== サイドバー ===== --> 33 <div class="container-fluid"> 34 <div class="row"> 35 <div class="col-sm-2 sidebar"> 36 <ul class="nav nav-pills nav-stacked"> 37 <li role="presentation"> 38 <a th:href="@{'/userList'}">ユーザ管理</a> 39 </li> 40 </ul> 41 </div> 42 </div> 43 </div> 44 <!-- ===== コンテンツ ===== --> 45 <div class="container-fluid"> 46 <div class="row"> 47 <div class="col-sm-10 col-sm-offset-2 main"> 48 <div th:include="__${contents}__"></div> 49 </div> 50 </div> 51 </div> 52</body> 53</html>
文字数制限の関係で全てのクラスやHTMLファイルを載せることはできないのですが、不明点などがあればコメントをお願いいたします。
よろしくお願い致します。