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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

解決済

Thymeleafのループのネストでつまづきました。

takashitamura03
tamuten

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1回答

0評価

0クリップ

1138閲覧

投稿2021/07/18 07:44

編集2021/07/18 07:52

前提・実現したいこと

(例)個人開発でJava(SpringBoot)で個別指導塾の授業管理システムを作っています。
時間割(何曜日の何限は開講しているとか)をテーブルで一覧表示させたいのですが、実装中に以下のエラーメッセージが発生しました。

どうしていいかわかりません。どうか解決法ご教授願います。

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

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/login/homeLayout.html]") Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "timed.timedId" (template: "login/timetable" - line 21, col 11) org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'timedId' cannot be found on object of type 'java.lang.String' - maybe not public or not valid?

該当のソースコード

Java

@Data @AllArgsConstructor public class TimedBoolean { private Integer timedId; private Boolean isOpen; }

Java

@Controller public class MTimetableController extends BaseController { @GetMapping("/timetable") public String index(Model model) { model.addAttribute("timetable", createTimetable()); return setView(model, "login/timetable"); } private Map<String, List<TimedBoolean>> createTimetable(){ Map<String, List<TimedBoolean>> timetable = new LinkedHashMap<>(); List<TimedBoolean> mon = new ArrayList<>(); mon.add(new TimedBoolean(1, false)); mon.add(new TimedBoolean(2, false)); mon.add(new TimedBoolean(3, true)); timetable.put("月", mon); List<TimedBoolean> tue = new ArrayList<>(); tue.add(new TimedBoolean(1, false)); tue.add(new TimedBoolean(2, false)); tue.add(new TimedBoolean(3, true)); timetable.put("火", tue); return timetable; } }

Java

@Controller public class BaseController { @Autowired MessageSource messageSource; @InitBinder public void initBinder(WebDataBinder binder) { // 未入力のStringをnullに設定する binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); } protected String setView(Model model, String contentPath) { String contentName = contentPath.substring(contentPath.lastIndexOf("/") + 1); model.addAttribute("contents", contentPath + " :: " + contentName + "_contents"); return "login/homeLayout"; } protected void setMessage(Model model, Message message) { model.addAttribute("message", messageSource.getMessage(message.getKey(), null, Locale.JAPAN)); } }

HTML

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <meta charset="UTF-8"></meta> </head> <body> <!-- ポイント:th:fragment --> <div th:fragment="timetable_contents"> <div class="page-header"> <h1>時間割管理</h1> </div> <form method="post" th:action="@{/timetable/update}" th:object="${timetableForm}"> <div th:if="${message}" class="alert alert-success"> <p th:text="${message}"></p> </div> <table class="table table-bordered table-striped"> <tr th:each="entry : ${timetable}"> <th:block th:each="timed : entry.value"> <td th:text="${timed.timedId}"></td> <td th:text="${timed.isOpen}"></td> </th:block> </tr> </table> <!-- 更新 --> <button class="btn btn-primary btn-lg pull-right" type="submit" name="update">更新</button> </form> </div> </body> <script type="text/javascript" th:inline="javascript"> /*<![CDATA[*/ /*]]>*/ </script> </html>

HTML

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <meta charset="UTF-8"></meta> <!-- Bootstrapの設定 --> <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel="stylesheet"></link> <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> <!-- CSSの読込 --> <link th:href="@{/css/home.css}" rel="stylesheet"></link> <!-- Font Awesomeの読込 --> <link href="https://use.fontawesome.com/releases/v5.15.1/css/all.css" rel="stylesheet"> <title>jukuSystem</title> </head> <body> <!-- ===== ヘッダー(ナビゲーションバー) ===== --> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container-fluid"> <div class="navbar-header"> <a class="navbar-brand" href="#">jukuSystem</a> </div> <form method="post" th:action="@{/logout}"> <button class="btn btn-link pull-right navbar-brand" type="submit"> ログアウト</button> </form> </div> </nav> <!-- ===== サイドバー ===== --> <div class="container-fluid"> <div class="row"> <div class="col-sm-2 sidebar"> <ul class="nav nav-pills nav-stacked"> <li role="presentation"><a th:href="@{'/studentList'}"><i class="fas fa-user-graduate"></i>&nbsp;生徒管理</a></li> <li role="presentation"><a th:href="@{'/teacherList'}"><i class="fas fa-chalkboard-teacher"></i>&nbsp;講師管理</a></li> <li role="presentation"><a class="js-menu_item_link" href="javascript:void(0)"><i class="fas fa-vr-cardboard"></i>&nbsp;マスタ管理</a> <ul class="submenu nav nav-pills nav-stacked"> <li role="presentation" class="submenu_item"><a th:href="@{'/courseList'}">&nbsp;コース管理</a></li> <li role="presentation" class="submenu_item"><a th:href="@{'/lessonList'}">&nbsp;授業管理</a></li> <li role="presentation" class="submenu_item"><a th:href="@{'/timetable'}">&nbsp;時間割管理</a></li> <li role="presentation" class="submenu_item"><a th:href="@{'/timed'}">&nbsp;時限管理</a></li> </ul></li> </ul> </div> </div> </div> <!-- ===== コンテンツ ===== --> <div class="container-fluid"> <div class="row"> <div class="col-sm-10 col-sm-offset-2 main"> <div th:include="__${contents}__"></div> </div> </div> </div> <script type="text/javascript" th:src="@{/js/jukuSystem.js}"></script> </body> </html>

試したこと

https://qiita.com/alpha_pz/items/95842733d06cb5c9eb1b
https://teratail.com/questions/5133
など参考にしてMapとListのネストでも表示できるようにするためにThymeleafを編集してきましたが、ここで詰まってしまいました。

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

Java:1.8
SpringBoot:2.5.2

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

jimbe

2021/07/18 08:14

フレームワークやテンプレエンジンは分からないのでこちらで失礼します。 例外のメッセージでは、 timed.timedId の個所で、 timed に(String 型の?) timedId が見当たらないと言っているように思えますが… may be でパブリックで無いか有効でないかとも。 TimedBoolean クラスでは private Integer timedId となっていますが、大丈夫なのでしょうか。
takashitamura03

2021/07/18 08:27

コメントありがとうございます。 thymeleafの書き方がまずかったようで、自己解決しました。
jimbe

2021/07/18 11:40

解決おめでとうございます。結果的に的外れで失礼しました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。