7月20日

投稿者: | 2020年7月20日

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 ライブラリーパスに追加する。