Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Thymeleafのth:eachでListが表示されない。

解決したいこと

springを使って掲示板サイトを作っています。
th:eachを使ってfindAll()でlistにしたエンティティを出力したいのですが、Whitelabel Error Pageが表示され、データベースから値を取得することが出来ません。
よろしくお願いします。

発生している問題・エラー

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

There was an unexpected error (type=Internal Server Error, status=500).

An error happened during template parsing (template: "class path resource [templates/timeline.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/timeline.html]")

Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "postID" (template: "timeline" - line 20, col 15)

Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "postID" (template: "timeline" - line 20, col 15)

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'postID' cannot be found on object of type 'jp.net.mikakutei.kinku.model.Posts' - maybe not public or not valid?

該当するソースコード

コントローラー↓

package jp.net.mikakutei.kinku.controller;

import java.util.List;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import jp.net.mikakutei.kinku.model.Posts;
import jp.net.mikakutei.kinku.model.PostsRepository;
import jp.net.mikakutei.kinku.model.User;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Controller
public class ServiceController {
  private final PostsRepository prep;

  @Autowired
  public ServiceController(PostsRepository prep) {
    this.prep=prep;
  }

  @GetMapping("/timeline")
  public String TimeLine(Model model){
    model.addAttribute("Posts", prep.findAll());
    return "timeline";
  }
}

モデル↓

package jp.net.mikakutei.kinku.model;

import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
@Table(name="Posts_Table")
public class Posts {
  @Column(name = "content", nullable = false)
  private String content;

  @Column(name = "created", nullable = false)
  private Timestamp created;

  @Column(name = "fav", nullable = false)
  private String fav;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name="postID",nullable=false)
  private Integer postID;

  @Column(name = "createUser", nullable = false)
  private String createUser;

  @Column(name="who_was_told",nullable= false)
  private String who_was_told;
}

リポジトリ↓

package jp.net.mikakutei.kinku.model;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PostsRepository extends JpaRepository<Posts,Integer> {

}

timeline.html↓

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Users List</title>
</head>
<body>
<h1>投稿一覧</h1>
    <table border="1">
    <tr>
        <th>postID</th>
        <th>作成者</th>
        <th>内容</th>
        <th>いいね</th>
        <th>作成日</th>
        <th>言われた相手</th>
    </tr>
    <tbody>
    <tr th:each="obj:${Posts}" th:object="${obj}">
        <td>[[*{postID}]]</td>
        <td>[[*{createUser}]]</td>
        <td>[[*{content}]]</td>
        <td>[[*{fav}]]</td>
        <td>[[*{created}]]</td>
        <td>[[*{who_was_told}]]</td>
        </tr>
    </tbody>
    </table>
</body>
</html>

application.yml↓

spring:
  datasource:
      url: jdbc:h2:mem:test
      driver-class-name: org.h2.Driver
      sql-script-encoding: UTF-8
      initialization-mode: always
      username: sa
      password:
  h2.console.enabled: true

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

テストデータsql

INSERT into posts_table(postID,create_User,content,who_was_told,fav,created)
VALUES(3,'b32a','fjg4t4343alf@ga','ccccbb',5,'2019-11-04 15:25:07');

INSERT into posts_table(postID,create_User,content,who_was_told,fav,created)
VALUES(4,'bbbbba','fjalf@ga','ddddddddddd',0,'2019-10-07 22:25:07');

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。
エラー箇所を特定するために、コメントアウトしながら実行していったところth:eachの部分をコメントアウトすると正常に動作するため、thymeleaf関連で問題があると思い、下記のサイト等を参考にhtmlやcontroller、modelクラスの見直しを行いましたが改善されませんでした。
https://teratail.com/questions/41064
https://teratail.com/questions/156753
https://qiita.com/sheercat/items/80f0c1a4e625b251b0ed

解決策
STS,JDKの再インストール
多分原因としてはJDKのバージョン2,3種類入っていたので、内部で競合していたか、OpenJDKとかいうやつを新しく入れたので、元々使っていたOracleのJDKとの相性が悪かったか、どっちかですね。

1

1Answer

ここの部分

<td>[[*{postID}]]</td>
...

ここが、

<td th:text="*{postID}"></td>
...

みたいな書き方するみたいです、おそらく…。

1Like

Comments

  1. th:textと書くのが面倒は場合は<td>[[*{postID}]]</td>でいいらしいです。
    一応試しては見ましたが、自分の環境ではWhite Label Pageになってしまいました(泣)、

Your answer might help someone💌