Thymeleafのth:eachでListが表示されない。
Q&A
Closed
解決したいこと
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との相性が悪かったか、どっちかですね。