実現したいこと
掌田津耶乃「Spring Bootプログラミング入門」の本に沿ってSpring Bootを勉強中です。
ページ分けの機能を実装したところ、エラーで内容が表示されません。
前章のコードに追記していく形式の本のため、不要なコードが大量にあるかと思います。
発生している問題・エラーメッセージ
http://localhost:8080/page/1にアクセスすると、ページ分けした1ページ目(3人分のデータ)が表示されるはずが、以下の404エラーが発生します。
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Oct 21 14:36:08 JST 2021 There was an unexpected error (type=Not Found, status=404).
該当のソースコード
MyDataService.java
Java
1package com.tuyano.springboot; 2 3import java.util.List; 4import javax.persistence.EntityManager; 5import javax.persistence.PersistenceContext; 6import javax.persistence.criteria.CriteriaBuilder; 7import javax.persistence.criteria.CriteriaQuery; 8import javax.persistence.criteria.Root; 9import org.springframework.data.domain.Page; 10import org.springframework.data.domain.PageRequest; 11import org.springframework.stereotype.Service; 12import com.tuyano.springboot.repositories.MyDataRepository; 13 14@Service 15public class MyDataService { 16 @PersistenceContext 17 private EntityManager entityManager; 18 public List<MyData> getAll() { 19 return (List<MyData>) entityManager.createQuery("from MyData") 20 .getResultList(); 21 } 22 public MyData get(int num) { 23 return (MyData) entityManager.createQuery("from MyData where id=" + num) 24 .getSingleResult(); 25 } 26 public List<MyData> find(String fstr) { 27 CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 28 CriteriaQuery<MyData> query = builder.createQuery(MyData.class); 29 Root<MyData> root = query.from(MyData.class); 30 query.select(root) 31 .where(builder.like(root.get("name"), "%" + fstr + "%")); 32 List<MyData> list = null; 33 list = (List<MyData>) entityManager.createQuery(query).getResultList(); 34 return list; 35 } 36 // P345リスト7-14 37 private MyDataRepository repository; // 書いていないけど多分いる。 38 39 public MyDataService(MyDataRepository repository) { 40 this.repository = repository; 41 } // 必要かも 42 private static final int PAGE_SIZE = 3; // 1ページの表示件数 43 public Page<MyData> getMyDataInPage(Integer pageNumber) { 44 PageRequest pageRequest = PageRequest.of(pageNumber - 1, PAGE_SIZE); 45 return repository.findAll(pageRequest); 46 } 47}
MyDataRepository.java
Java
1package com.tuyano.springboot.repositories; 2import java.util.List; 3import java.util.Optional; 4import org.springframework.data.jpa.repository.JpaRepository; 5import org.springframework.data.jpa.repository.Query; 6import org.springframework.stereotype.Repository; 7import com.tuyano.springboot.MyData; 8 9@Repository 10public interface MyDataRepository extends JpaRepository<MyData, Long> { 11 public Optional<MyData> findById(Long name); 12 @Query("SELECT d FROM MyData d ORDER BY d.name") 13 List<MyData> findAllOrderByName(); 14 public List<MyData> findByNameLike(String name); 15 public List<MyData> findByIdIsNotNullOrderByIdDesc(); 16 public List<MyData> findByAgeGreaterThan(Integer age); 17 public List<MyData> findByAgeBetween(Integer age1, Integer age2); 18}
HeloController.java
Java
1package com.tuyano.springboot; 2 3import java.util.List; 4import javax.annotation.PostConstruct; 5import javax.servlet.http.HttpServletRequest; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.stereotype.Controller; 8import org.springframework.transaction.annotation.Transactional; 9import org.springframework.validation.BindingResult; 10import org.springframework.validation.annotation.Validated; 11import org.springframework.web.bind.annotation.ModelAttribute; 12import org.springframework.web.bind.annotation.PathVariable; 13import org.springframework.web.bind.annotation.RequestMapping; 14import org.springframework.web.bind.annotation.RequestMethod; 15import org.springframework.web.bind.annotation.RequestParam; 16import org.springframework.web.servlet.ModelAndView; 17import com.tuyano.springboot.repositories.MyDataRepository; 18 19@Controller 20public class HeloController { 21 @Autowired 22 MyDataRepository repository; 23 @Autowired 24 private MyDataService service; 25 // index 26 @RequestMapping(value = "/", method = RequestMethod.GET) 27 public ModelAndView index(ModelAndView mav) { 28 mav.setViewName("index"); 29 mav.addObject("title", "Find Page"); 30 mav.addObject("msg", "MyDataのサンプルです。"); 31 List<MyData> list = service.getAll(); 32 mav.addObject("datalist", list); 33 return mav; 34 } 35 // 36 // index※追記 37 // 38 @RequestMapping(value = "/page/{num}", method = RequestMethod.GET) 39 public ModelAndView page(@PathVariable Integer num, 40 ModelAndView mav) { 41 Page<MyData> page = service.getMyDataInPage(num); 42 mav.setViewName("index"); 43 mav.addObject("title", "Find Page"); 44 mav.addObject("msg", "MyDataのサンプル。"); 45 mav.addObject("pagenumber", num); 46 mav.addObject("datalist", page); 47 return mav; 48 } 49 50 // find 51 @RequestMapping(value = "/find", method = RequestMethod.GET) 52 public ModelAndView find(ModelAndView mav) { 53 mav.setViewName("find"); 54 mav.addObject("title", "Find Page"); 55 mav.addObject("msg", "MyDataのサンプルです"); 56 mav.addObject("value", ""); 57 List<MyData> list = service.getAll(); 58 mav.addObject("datalist", list); 59 return mav; 60 } 61 @RequestMapping(value = "/find", method = RequestMethod.POST) 62 public ModelAndView search(HttpServletRequest request, ModelAndView mav) { 63 mav.setViewName("find"); 64 String param = request.getParameter("fstr"); 65 if (param == "") { 66 mav = new ModelAndView("redirect:/find"); 67 } else { 68 mav.addObject("title", "Find result"); 69 mav.addObject("msg", "ID 「" + param + "」の検索結果"); 70 mav.addObject("value", param); 71 List<MyData> list = service.find(param); 72 mav.addObject("datalist", list); 73 } 74 return mav; 75 } 76 // P342リスト7-12 77 @Autowired 78 MyDataBean myDataBean; 79 @RequestMapping(value = "/{id}", method = RequestMethod.GET) 80 public ModelAndView indexById(@PathVariable long id, ModelAndView mav) { 81 mav.setViewName("pickup"); 82 mav.addObject("title", "Pickup Page"); 83 String table = "<table>" + myDataBean.getTableTagById(id) + "</table>"; // getTableTagByIdを呼んで結果をdataに設定 84 mav.addObject("msg", "pickup data id=" + id); 85 mav.addObject("data", table); 86 return mav; 87 } 88 // ダミーデータ 89 @PostConstruct 90 public void init() { 91 // dao = new MyDataDaoImpl(entityManager); // P325リスト7-2では不要 92 MyData d1 = new MyData(); 93 d1.setName("寺本 和香"); 94 d1.setAge(49); 95 d1.setMail("teramoto_waka@example.com"); 96 d1.setMemo("090-733-7001"); 97 repository.saveAndFlush(d1); 98 99 MyData d2 = new MyData(); 100 d2.setName("矢野 瞬"); 101 d2.setAge(12); 102 d2.setMail("yano_shun@example.com"); 103 d2.setMemo("080-8954-9502"); 104 repository.saveAndFlush(d2); 105 106 MyData d3 = new MyData(); 107 d3.setName("篠崎 有起哉"); 108 d3.setAge(60); 109 d3.setMail("shinozaki_yukiya@example.com"); 110 d3.setMemo("090-5822-6387"); 111 repository.saveAndFlush(d3); 112 113 MyData d4 = new MyData(); 114 d4.setName("宍戸 美咲"); 115 d4.setAge(43); 116 d4.setMail("shishido_misaki@example.com"); 117 d4.setMemo("090-6709-6949"); 118 repository.saveAndFlush(d4); 119 } 120 @RequestMapping(value = "/other") 121 public String other() { 122 return "redirect:/"; 123 } 124 @RequestMapping("/home") 125 public String home() { 126 return "forward:/"; 127 } 128 class DataObject { 129 private int id; 130 private String name; 131 private String value; 132 public DataObject(int id, String name, String value) { 133 super(); 134 this.id = id; 135 this.name = name; 136 this.value = value; 137 } 138 public int getId() { 139 return id; 140 } 141 public void setId(int id) { 142 this.id = id; 143 } 144 public String getName() { 145 return name; 146 } 147 public void setName(String name) { 148 this.name = name; 149 } 150 public String getValue() { 151 return value; 152 } 153 public void setVaue(String value) { 154 this.value = value; 155 } 156 } 157}
index.html
Html
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<title>Top page</title> 5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6<script src="http://code.jquery.com/jquery.min.js"></script><!-- jQueryを利用 --> 7<script th:inline="javascript"> 8$(document).ready(function(){ 9 var num=/*[[${param.id[0]}]]*/; 10 $.get("/rest/"+num,null,callback); // jQuery 11}); 12function callback(result){ 13 $('#obj').append('<li>id: '+result.id+'</li>'); 14 $('#obj').append('<li>name: '+result.name+'</li>'); 15 $('#obj').append('<li>mail: '+result.mail+'</li>'); 16 $('#obj').append('<li>age: '+result.age+'</li>'); 17 $('#obj').append('<li>memo: '+result.memo+'</li>'); 18} 19</script> 20<style> 21h1 { 22 font-size: 18pt; 23 font-weight: bold; 24 color: gray; 25} 26body { 27 font-size: 13pt; 28 color: gray; 29 margin: 5px 25px; 30} 31tr { 32 margin: 5px; 33} 34th { 35 padding: 5px; 36 color: white; 37 background: darkgray; 38} 39td { 40 padding: 5px; 41 color: black; 42 background: #e0e0ff; 43} 44</style> 45</head> 46<body> 47 <h1 th:text="#{content.title}">Hello page</h1> 48 <p th:text="${msg}"></p> 49 <!-- ここにエラーメッセージ --> 50<ul id="obj"></ul> 51 <table> <tr> 52 <th>ID</th> 53 <th>名前</th> 54 <th>年齢</th> 55 <th>メールアドレス</th> 56 <th>コメント(TEL)</th> 57 </tr> 58 <tr th:each="obj : ${datalist}"> 59 <td th:text="${obj.id}"></td> 60 <td th:text="${obj.name}"></td> 61 <td th:text="${obj.age}"></td> 62 <td th:text="${obj.mail}"></td> 63 <td th:text="${obj.memo}"></td> 64 </tr> 65 </table> 66</body> 67</html>
試したこと
MyDataService.javaで発生していた構文エラーだけは何とか解決しました。
補足情報
Eclipse Version: 2021-06 (4.20.0)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/21 06:49
2021/10/21 07:04
2021/10/21 07:36 編集
2021/10/22 04:49