追記1:
WebConfig.javaで,super.addArgumentResolvers(argumentResolvers);としました。
すると,”メソッド addArgumentResolvers(List<HandlerMethodArgumentResolver>) は型 Object で未定義です”とコンソール上に表示されてしまいます。現在はここで詰まっています。
前提・実現したいこと
下記2つのサイトを参考に,ページネーションの実装を試みたのですが,うまくいかず困ってしまいました。
①SpringBoot + JPA + Thymeleafで簡単なCRUDを作る②~画面と機能作成まで~
②Spring Boot + Thymeleafでページング機能を実装する
うまくいかない理由などをご指摘いただけると幸いです。また,フレームワークではなく,JavaScriptで実装した方が良いなどの意見があれば,そちらもご教示いただけると幸いです。
該当のソースコード
まず,①を参考にアプリケーションを作成しました。
これをもとに,②のサイトを参考にして,付け加える形でぺージネーションを実装しようと思いました。
下記に①のサイトから変更したコードのみ示します。
※import,package名は長くなるので省略します。
PlayerRepository
1@Repository 2public interface PlayerRepository extends JpaRepository<Player, Long> { 3 //次の関数を新たに定義 4 public Page<Player> findAll(Pageable pageable); 5}
PlayerController
1@Controller 2@RequestMapping("/players") 3public class PlayerController { 4 5 @Autowired 6 private PlayerService playerService; 7 8 //indexを削除 9 //@GetMapping 10 //public String index(Model model) { 11 //List<Player> players = playerService.findAll(); 12 //model.addAttribute("players", players); 13 //return "players/index"; 14 //} 15 16 @GetMapping("new") 17 public String newPlayer(Model model) { 18 return "players/new"; 19 } 20 21 @GetMapping("{id}/edit") 22 public String edit(@PathVariable Long id, Model model) { // ⑤ 23 Player player = playerService.findOne(id); 24 model.addAttribute("player", player); 25 return "players/edit"; 26 } 27 28 @GetMapping("{id}") 29 public String show(@PathVariable Long id, Model model) { 30 Player player = playerService.findOne(id); 31 model.addAttribute("player", player); 32 return "players/show"; 33 } 34 35 @PostMapping 36 public String create(@ModelAttribute Player player) { 37 playerService.save(player); 38 return "redirect:/players"; 39 } 40 41 @PutMapping("{id}") 42 public String update(@PathVariable Long id, @ModelAttribute Player player) { 43 player.setId(id); 44 playerService.save(player); 45 return "redirect:/players"; 46 } 47 48 @DeleteMapping("{id}") 49 public String destroy(@PathVariable Long id) { 50 playerService.delete(id); 51 return "redirect:/players"; 52 } 53 54 //getwordListを追加 55 @GetMapping 56 public String getWordList(Model model, Pageable pageable) { 57 Page<Player> players = playerService.getAllWord(pageable); 58 model.addAttribute("players", players); 59 model.addAttribute("words", players.getContent()); 60 model.addAttribute("url", "/players"); 61 return "players/index"; 62 } 63 64} 65
PlayerService
1@Service 2public class PlayerService { 3 4 @Autowired 5 private PlayerRepository playerRepository; 6 7 public List<Player> findAll() { 8 return playerRepository.findAll(); 9 } 10 11 public Player findOne(Long id) { 12 return playerRepository.findById(id).orElse(null); 13 } 14 15 public Player save(Player player) { 16 return playerRepository.save(player); 17 } 18 19 public void delete(Long id) { 20 playerRepository.deleteById(id); 21 } 22 //getAllword関数を追加 23 public Page<Player> getAllWord(Pageable pageable) { 24 return playerRepository.findAll(pageable); 25 } 26}
index
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="utf-8" /> 5<title>Listing Players - baseball</title> 6<link rel="stylesheet" href="/css/bootstrap.css" /> 7<script src="/js/jquery.js"></script> 8<script src="/js/bootstrap.js"></script> 9</head> 10<body> 11 <div class="container"> 12 <h1>Listing Players</h1> 13 <table class="table"> 14 <thead> 15 <tr> 16 <th>ID</th> 17 <th>名前</th> 18 <th>年齢</th> 19 <th>チーム名</th> 20 <th>守備位置</th> 21 <th></th> 22 <th></th> 23 <th></th> 24 </tr> 25 </thead> 26 <tbody> 27 <tr th:each="player:${players}" th:object="${player}"> 28 <!-- ③ --> 29 <td th:text="*{id}"></td> 30 <td th:text="*{name}"></td> 31 <td th:text="*{age}"></td> 32 <td th:text="*{team}"></td> 33 <td th:text="*{position}"></td> 34 <td><a class="btn btn-default btn-xs" 35 th:href="@{/players/{id}(id=*{id})}">参照</a></td> 36 <td><a class="btn btn-default btn-xs" 37 th:href="@{/players/{id}/edit(id=*{id})}">編集</a></td> 38 <td> 39 <!--下記を追加--> 40 <form th:action="@{/players/{id}(id=*{id})}" th:method="delete"> 41 <input class="btn btn-default btn-xs" type="submit" value="削除" /> 42 </form> 43 </td> 44 </tr> 45 </tbody> 46 </table> 47 <div> 48 <ul> 49 <li th:class="${players.first} ? 'disabled':''" style="display: inline"> 50 <span th:if="${players.first}">←先頭</span> <a th:if="${not players.first}" 51 th:href="@{${url}(players=0)}">←先頭</a> 52 </li> 53 <li th:each='i : ${#numbers.sequence(0, players.totalPages-1)}' 54 th:class="(${i}==${players.number})? 'active' : ''" 55 style="display: inline"><span th:if='${i}==${players.number}' 56 th:text='${i+1}'>1</span> <a th:if='${i}!=${players.number}' 57 th:href="@{${url}(players=${i})}"> <span th:text='${i+1}'>1</span> 58 </a></li> 59 <li th:class="${players.last} ? 'disabled':''" style="display: inline"> 60 <span th:if="${players.last}">末尾➝</span> <a th:if="${not players.last}" 61 th:href="@{${url}(players=(${players.totalPages}-1))}">末尾➝</a> 62 </li> 63 </ul> 64 </div> 65 <!--ここまで--> 66 <a class="btn btn-default" href="/players/new">新規作成</a> 67 </div> 68</body> 69</html>
次に②のサイトにある,WebConfigクラスを作成しました。
※非推奨となっていたクラスがあったので,それは書き換えています。
WebConfig
1@Configuration 2public class WebConfig implements WebMvcConfigurer { 3 4 @Override 5 public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 6 PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); 7 //ページ単位に表示する件数 8 resolver.setFallbackPageable(PageRequest.of(0, 5)); 9 argumentResolvers.add(resolver); 10 addArgumentResolvers(argumentResolvers); 11 } 12 13}
コンソールを確認すると下記のメッセージが複数表示され,作成したアプリケーションを実行できなくなります。
message
おそらく,WebConfig.java以外にもBeanとかいろいろ用意しないといけないファイルがあるのだとは思いますが,Java初心者のため,どのようにすればよいか分からずにいます。
どなたかご教示いただけるとありがたいです。
補足情報(FW/ツールのバージョンなど)
Spring Boot 2.15
Maven
Java 8

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/09 13:04
退会済みユーザー
2019/06/09 13:23
2019/06/13 19:23