2019.04.25
こんにちは!
今回はSpring Bootを利用してデータアクセスをし、そこで得たデータをthymeleafで表示する際の注意点を紹介したいと思います。
動作環境は以下になります。
・OS:Windows 10 64bit
・STS:v3.9.2
・Spring Boot:v2.1.4
・ビルドツール:Maven
今回は本のデータが登録してあるデータベースからデータを全件取得するものをつくります。
それぞれ用意したコントローラやエンティティクラス、リポジトリなどです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | @Entity @Table(name="bookdata") public class BookData { @Id @Column(nullable=false) private long id; @Column(length=20, nullable=false) private String genre; @Column(length=20, nullable=false) private String author; @Column(length=50, nullable=false) private String title; public long getId(){ return id; } public String getGenre() { return genre; } public void setGenre(String genre) { this.genre = genre; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } |
ここでは本のタイトル、著者、ID、ジャンルを定義しています。
1 2 3 | @Repository public interface BookDataRepository extends JpaRepository<BookData, Long>{ } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Controller public class StockController { @Autowired BookDataRepository bRepository; @RequestMapping(value="/", method = RequestMethod.GET) public ModelAndView index(@ModelAttribute("formModel") BookData bdata, ModelAndView mav) { mav.setViewName("index"); Iterable list = bRepository.findAll(); mav.addObject("booklist",list); return mav; } } |
本のデータを全件取得してthymeleafに値を渡しているだけのメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <h4>index.html</h4> <pre class="lang:sh decode:true"> <!DOCTYPE html> <html xmlns:th="http://www.themeleaf.org"> <head> <title>TRANSONIC書店 在庫管理システム</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" media="all" th:href="@{/css/index.css}"/> </head> <body> <table> <tr><th>タイトル</th><th>著者名</th><th>ジャンル</th></tr> <tr th:each="obj : ${booklist}"> <td th:text="${obj.title}"></td> <td th:text="${obj.author}"></td> <td th:text="${obj.genre}"></td> </tr> </table> </body> </html> |
これでビルドして接続してみるとしっかり表示されています。
ではエンティティクラスのGetterの名前を変えてみましょう。
ここでは試しにgetGenre()メソッドをtedGenre()に変えます。
1 2 3 | public String tedGenre() { return genre; } |
ビルドをしてみると、エラーが出力され、画面は表示されません。
1 | org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "obj.genre" (template: "index" - line 16, col 17) |
どうやらgetterのメソッド名はget~という形で始まらないといけないようです。
私はエンティティのフィールドにboolean型でis~という形で始まるフィールドを用意したときに、IDEのGetter,Setter自動生成機能にてGetter,Setterを作成していたため、
そのプロパティのGetterがis~というメソッド名になっていました。それで上記のようなエラーが出る体験をしました。
知っている方も多いと思いますが、紹介させていただきました。
以上です。ありがとうございました。