HTMLテンプレートの修正箇所。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>msgdata</title>
</head>
<body>
<div th:fragment="msgdata">
<h1>MsgData</h1>
<p>MsgDataフラグメント</p>
<p th:text="${msg}"></p>
<form action="/msg" method="post" th:object="${msgdata}">
<table>
<tr>
<th>タイトル</th>
<td>
<input type="text" name="title" th:value="*{title}" />
<div th:if="${#fields.hasErrors('title')}" th:errors="*{title}"></div>
</td>
</tr>
<tr>
<th>メッセージ</th>
<td>
<textarea name="message" th:value="*{message}"></textarea>
<div th:if="${#fields.hasErrors('message')}" th:errors="*{message}"></div>
</td>
</tr>
<tr>
<th>MyDataのid</th>
<td>
<input type="text" name="mydata" />
<div th:if="${#fields.hasErrors('mydata')}" th:errors="*{mydata}"></div>
</td>
</tr>
<tr>
<th></th><td><input type="submit" value="登録" /></td>
</tr>
</table>
</form>
<table>
<tr>
<th>ID</th>
<th>名前</th>
<th>タイトル</th>
</tr>
<tr th:each="msgdata : ${list}">
<td th:text="${msgdata.id}"></td>
<td th:if="${msgdata.mydata != null}" th:text="${msgdata.mydata.name}"></td>
<td th:text="${msgdata.title}"></td>
</tr>
</table>
</div>
</body>
</html>
MsgData.java
package jp.abc;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Entity
public class MsgData {
@Id
@Column
@GeneratedValue
@NotNull
private long id;
@Column
@NotEmpty
private String title;
@Column
@NotEmpty
private String message;
@ManyToOne
private MyData mydata;
public MsgData() {
mydata = new MyData();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public MyData getMydata() {
return mydata;
}
public void setMydata(MyData mydata) {
this.mydata = mydata;
}
}
MsgDataCriteriaDao.java
package jp.abc;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.springframework.stereotype.Repository;
@Repository
public class MsgDataCriteriaDao implements MsgDataDao {
private EntityManager entityManager;
public MsgDataCriteriaDao() {
super();
}
public MsgDataCriteriaDao(EntityManager manager) {
this();
entityManager = manager;
}
@Override
public List<MsgData> findAll() {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<MsgData> query = builder.createQuery(MsgData.class);
Root<MsgData> root = query.from(MsgData.class);
query.select(root);
return entityManager.createQuery(query).getResultList();
}
@Override
public MsgData findById(long id) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<MsgData> query = builder.createQuery(MsgData.class);
Root<MsgData> root = query.from(MsgData.class);
query.select(root).where(builder.equal(root.get("id"), id));
return entityManager.createQuery(query).getSingleResult();
}
}
MsgDataController.java
package jp.abc;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MsgDataController {
@Autowired
private MsgDataRepository repository;
@PersistenceContext
private EntityManager entityManager;
private MsgDataDao msgDataDao;
@PostConstruct
public void init() {
msgDataDao = new MsgDataCriteriaDao(entityManager);
}
@RequestMapping(value = "/msg", method = RequestMethod.GET)
public ModelAndView msg(ModelAndView mav) {
List<MsgData> list = msgDataDao.findAll();
mav.addObject("list", list);
mav.addObject("template", "msgdata");
mav.addObject("fragment", "msgdata");
mav.setViewName("layout");
MsgData msgData = new MsgData();
mav.addObject("msgdata", msgData);
return mav;
}
@RequestMapping(value = "/msg", method = RequestMethod.POST)
public ModelAndView post(
@ModelAttribute("msgdata") @Validated MsgData msgdata,
BindingResult result,
ModelAndView mav) {
if (result.hasErrors()) {
List<MsgData> list = msgDataDao.findAll();
mav.addObject("list", list);
mav.addObject("template", "msgdata");
mav.addObject("fragment", "msgdata");
mav.setViewName("layout");
return mav;
}
repository.saveAndFlush(msgdata);
return new ModelAndView("redirect:/msg");
}
}
repository のコピーが終わったら、pom.xml の一部を修正する。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent>
修正すると勝手に import が書き換えられるため、ソースを修正する。
エラーが出ている import の行を削除し、javax.persistence パッケージをインポートしなおす。
Testクラスでもエラーになるので、JUnit5 ライブラリーパスに追加する。