テンプレートファイル表示をさせた際に、エラーが発生してしまいました。
実行は、「Eclipse」より実行させ、アクセスはブラウザに「http://localhost:8080/edit/1」と打ち込み行いました。
エラー内容は以下となります。(長すぎるので一部抜粋)
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri May 01 22:23:32 JST 2020 There was an unexpected error (type=Internal Server Error, status=500). An error happened during template parsing (template: "class path resource [templates/edit.html]") org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/edit.html]") at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
下記は、edit.htmlです。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>edit page </title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style> h1{font-size:18pt;font-weight:bold;color:gray;} body{ font-size:13pt; color:gray; margin:5px 25px;} tr{margin:5px;} th{padding:5px; color:white;background: darkgray;} td{padding:5px; color:black;background:e0e0ff;} </style> </head> <body> <h1 th:text="${title}">Edit page</h1> <table> <form method="post" action="/edit" th:object="${formModel}"> <input type="hidden" name="id" th:value="*{id}"/> <tr> <td><label for="name">名前</label></td> <td><input type="text" name="name" th:value="*{name}"></td> </tr> <tr> <td><label for="age">年齢</label></td> <td><input type="text" name="age" th:value="*{age}"></td> </tr> <tr> <td><label for="mail">メール</label></td> <td><input type="text" name="mail" th:value="*{mail}"></td> </tr> <tr> <td><label for="memo">メモ</label></td> <td><textarea name="memo" th:text="*{memo}" cols="20" rows="5"></textarea></td> </tr> <tr> <td><input type="submit"></td> </tr> </form> </table> </body> </html>
下記はHeloController.javaになります。
package com.test.springboot; import java.util.Optional; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; // import javax.transaction.Transactional; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; // import org.springframework.web.servlet.ModelAndView; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.shinya.springboot.repositories.MyDataRepository; @Controller public class HeloController { @Autowired MyDataRepository repository; @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET) public ModelAndView edit(@ModelAttribute MyData mydata, @PathVariable int id, ModelAndView mav) { mav.setViewName("edit"); mav.addObject("title", "edit mydata."); Optional<MyData> data = repository.findById((long) id); mav.addObject("formModel",data); System.out.println("ok"); return mav; } @RequestMapping(value="/edit",method=RequestMethod.POST) @Transactional(readOnly=false) public ModelAndView form(@ModelAttribute MyData mydata,ModelAndView mav){ repository.saveAndFlush(mydata); return new ModelAndView("redirect:/"); } @PostConstruct public void init() { MyData d1 = new MyData(); d1.setName("tuyano"); d1.setAge(123); d1.setMail("syoda@tuyano.com"); d1.setMemo("this is my data!"); repository.saveAndFlush(d1); MyData d2 = new MyData(); d2.setName("hanako"); d2.setAge(15); d2.setMail("hanako@flower"); d2.setMemo("my girl friend"); repository.saveAndFlush(d2); MyData d3 = new MyData(); d3.setName("sachiko"); d3.setAge(37); d3.setMail("sachico@happy"); d3.setMemo("my work friend..."); repository.saveAndFlush(d3); } } class DataObject{ private int id; private String name; private String value; public DataObject(int id, String name, String value){ super(); this.id = id; this.name = name; this.value = value; } public int getId(){ return id;} public void setId(int id){ this.id = id;} public String getName() { return name;} public void setName(String name){ this.name = name; } public String getValue(){ return value; } public void setValue(String value){ this.value = value; } }
エラー内容で調べた結果、こちらの記事などを見つけましたが、解決に繋がる情報は載っていませんでした。
こちらのエラーの解決方法を教えて頂けましたら幸いです。
実行環境:
Eclipseのバージョン: Version: 2019-12 (4.14.0)
OS: MacOSMojave
追記
エラー内容に下記の行が見当たりました。
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "id" (template: "edit" - line 18, col 44)
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'id' cannot be found on object of type 'java.util.Optional' - maybe not public or not valid?
こちらのエラーからQiitaなど見てみましたが、未だ解決方法はわかっていない状況です
以下は、エンティティクラス「MyData.java」です
package com.test.springboot; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="mydata") public class MyData { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column private long id; @Column(length = 50,nullable = false) private String name; @Column(length = 200,nullable = true) private String mail; @Column(nullable = true) private Integer age; @Column(nullable = true) private String memo; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public Integer getAge(){ return age; } public void setAge(Integer age) { this.age = age; } public String getMemo() { return memo; } public void setMemo(String memo) { this.memo = memo; } }
回答1件
あなたの回答
tips
プレビュー