質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2860閲覧

ページネーションの実装方法

tanukitii

総合スコア44

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/06/09 10:09

編集2019/06/09 13:37

追記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

1at com.example.demo.baseball.config.WebConfig.addArgumentResolvers(WebConfig.java:20) ~[classes/:na]

おそらく,WebConfig.java以外にもBeanとかいろいろ用意しないといけないファイルがあるのだとは思いますが,Java初心者のため,どのようにすればよいか分からずにいます。
どなたかご教示いただけるとありがたいです。

補足情報(FW/ツールのバージョンなど)

Spring Boot 2.15
Maven
Java 8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メソッドの再帰処理を抜ける条件がなけりゃ スタックオーバーフローになるだろう
明示的に親の実装をつかうなら super. をつけるべき

投稿2019/06/09 11:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanukitii

2019/06/09 13:04

それでsuperが必要だったんですね…。 ただ,WebConfig.javaで,super.addArgumentResolvers(argumentResolvers);としたところ, ”メソッド addArgumentResolvers(List<HandlerMethodArgumentResolver>) は型 Object で未定義です”とコンソール上に表示されてしまいます。 参考にしているサイトには,それらしき記述が見当たらないので,どのようにしたらよいか分かりません。もし,何か分かれば,ご教示いただけると幸いです。よろしくお願い致します。
退会済みユーザー

退会済みユーザー

2019/06/09 13:23

そもそも、「 WebMvcConfigurerAdapter 」 は何も行わない実装(INTERFACEで十分)だったので非推奨になりましたが親クラスの何を利用したかったのでしょうか?
tanukitii

2019/06/13 19:23

ご連絡遅くなってしまい,申し訳ございません。 書籍を読みながら,しばらく考えていたのですが, どうすればよいか分かりませんでした。 上記コードとは異なる方法を検討することにします。 せっかくヒントを与えてくださったのに,申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問