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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

Q&A

解決済

1回答

1796閲覧

SpringBootを使った掲示板サイトのページからJPARepositoryのメソッドを使用して書き込みを削除する方法

hfm_225

総合スコア2

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

0グッド

0クリップ

投稿2022/02/18 09:08

編集2022/02/18 13:07

SpringBoot、Thymeleaf、PostgreSQLを使用して掲示板を作成しています。
トップページとは別に管理者ページを設け、そこから過去の投稿内容を削除できる機能を実装したいのですが、削除ボタンを押下すると404エラーが表示されてしまい、調べながらコードを書き換えて意図したとおりに動きません。
404エラーが表示されてしまう理由と、解決策をご教授いただきたいです。

現時点で実現していること

・トップページに投稿フォームを設け、送信ボタン押下で書き込んだユーザ名と書き込み内容をDBに保存する
・トップページの下に、過去の投稿を一覧として表示する
・管理者ページに投稿一覧と、削除ボタンを設ける

実現させたいこと

・管理者ページにアクセスし、削除したい投稿の隣にある削除ボタンで投稿を削除する
・投稿削除後は管理者ページにリダイレクトする

ページが見つからない、というエラーだとは理解しているのですが、何が原因かわからず躓いています。

よろしくお願いいたします。

Post.java

1package com.example.demo.domain; 2 3/* 4 * SpringBootとJPAを使っていれば、Entityクラスを作ると自動的にテーブルを生成してくれる 5 */ 6 7import javax.persistence.Entity; 8import javax.persistence.GeneratedValue; 9import javax.persistence.GenerationType; 10import javax.persistence.Id; 11 12@Entity //を付けることでDBのテーブルと紐づく 13public class Post { 14 @Id //を付けた変数が、そのテーブルの主キーになる 15 @GeneratedValue(strategy = GenerationType.IDENTITY) 16 private Long id; //主キーであり、自動的に連番が割り振られる 17 private String username; //投稿者名 18 private String posted_statement; //投稿内容 19 20 public Long getId() { 21 return id; 22 } 23 public void setId(Long id) { 24 this.id = id; 25 } 26 public String getUsername() { 27 return username; 28 } 29 public void setUsername(String username) { 30 this.username = username; 31 } 32 public String getPosted_statement() { 33 return posted_statement; 34 } 35 public void setPosted_statement(String posted_statement) { 36 this.posted_statement = posted_statement; 37 } 38 @Override 39 public String toString() {//文字列に変換するメソッド 40 return "Post [id=" + id + ", username=" + username + ", posted_statement=" + posted_statement + "]"; 41 } 42 43} 44

PostService.java

1package com.example.demo.service; 2/* 3 * Repositoryのメソッドを呼び出す処理を記述 4 */ 5 6import java.util.List; 7 8import org.springframework.beans.factory.annotation.Autowired; 9import org.springframework.stereotype.Service; 10 11import com.example.demo.domain.Post; 12import com.example.demo.repository.PostRepository; 13 14@Service 15public class PostService { 16 @Autowired//を付けて宣言するとBeanをインジェクトしてくれるのでnewしなくても使うことができる 17 private PostRepository postRepository; 18 19 public List<Post> findAll() { 20 return postRepository.findAll(); 21 } 22 23 //public Post findOne(Long id) { 24 //return postRepository.findOne(id); 25 //} 26 27 28 public Post save(Post post) { 29 return postRepository.save(post); 30 } 31 32 33 34 35 public Post findById(Long id) { 36 return postRepository.findById(id).get(); 37 } 38 39 40 41 42 43 public void delete(Long id) { 44 Post post = findById(id); 45 postRepository.delete(post); 46 } 47} 48

PostController.java

1package com.example.demo.controller; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Controller; 7import org.springframework.ui.Model; 8import org.springframework.web.bind.annotation.DeleteMapping; 9import org.springframework.web.bind.annotation.GetMapping; 10import org.springframework.web.bind.annotation.ModelAttribute; 11import org.springframework.web.bind.annotation.PathVariable; 12import org.springframework.web.bind.annotation.PostMapping; 13import org.springframework.web.bind.annotation.RequestMapping; 14 15import com.example.demo.domain.Post; 16import com.example.demo.service.PostService; 17 18@Controller 19@RequestMapping("/posts") 20public class PostController { 21 @Autowired 22 private PostService postService; 23 24 @GetMapping 25 public String index(Model model) { 26 List<Post> posts = postService.findAll(); 27 model.addAttribute("posts", posts); 28 return "posts/index"; 29 } 30 31 @PostMapping 32 public String create(@ModelAttribute Post post) { 33 postService.save(post); 34 return "redirect:/posts"; 35 } 36 37 38 @GetMapping("admin") 39 public String showAdmin(Model model) { 40 List<Post> posts = postService.findAll(); 41 model.addAttribute("posts", posts); 42 return "posts/admin"; 43 } 44 45 46 47 @DeleteMapping("/{id}") 48 public String destroy(@PathVariable Long id) { 49 postService.delete(id); 50 return "redirect:/admin"; 51 } 52 53}

PostRepository.java

1package com.example.demo.repository; 2 3import org.springframework.data.jpa.repository.JpaRepository; 4import org.springframework.stereotype.Repository; 5 6import com.example.demo.domain.Post; 7 8 9@Repository 10public interface PostRepository extends JpaRepository<Post, Long> { 11 12 13} 14

index.html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <meta charset="utf-8" /> 5 <title>掲示板トップページ</title> 6 7 <link rel="stylesheet" href="/css/bootstrap.css" /><!-- cssとjavascriptのファイルを読み込む--> 8 9 <script src="/js/jquery.js"></script> 10 <script src="/js/bootstrap.js"></script> 11 </head> 12 13 <body> 14 <h1>掲示板</h1><!-- 見出し --> 15 16 <form th:action="@{/posts}" th:method="post"> 17 18 <h5>ユーザ名</h5> 19 <input class="form-control" type="text" name="username" /> 20 21 <h5>書き込み</h5> 22 <textarea class="form-control" name="posted_statement" cols="30" rows="5"></textarea> 23 24 <button class="btn btn-default" type="submit">投稿</button> 25 26 </form> 27 28 <h5>みんなの書き込み</h5> 29 <table class="table"> 30 31 <thead><!-- 表のヘッダ部分としてグループ化するためのタグ --> 32 <tr> 33 <th>No</th> 34 <th>書き込み</th> 35 <th>ユーザ名</th> 36 </tr> 37 </thead><!-- 表のヘッダ部分としてグループ化するためのタグ --> 38 39 40 <tbody> 41 <tr th:each="post:${posts}" th:object="${post}"><!--Controllerから渡されたplayersに対してループ処理を行っている--> 42 43 <td th:text="*{id}"></td> 44 <td th:text="*{posted_statement}"></td> 45 <td th:text="*{username}"></td> 46 47 </tr> 48 </tbody> 49 50 51 52 </table> 53 </body> 54</html>

admin.html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <meta charset="utf-8" /> 5 <title>管理者ページ</title> 6 7 <link rel="stylesheet" href="/css/bootstrap.css" /><!-- cssとjavascriptのファイルを読み込む--> 8 9 <script src="/js/jquery.js"></script> 10 <script src="/js/bootstrap.js"></script> 11 </head> 12<body> 13 14 <h2>管理者ページ</h2> 15 16 <h5>みんなの書き込み</h5> 17 <table class="table"> 18 19 <thead><!-- 表のヘッダ部分としてグループ化するためのタグ --> 20 <tr> 21 <th>No</th> 22 <th>書き込み</th> 23 <th>ユーザ名</th> 24 </tr> 25 </thead><!-- 表のヘッダ部分としてグループ化するためのタグ --> 26 27 28 <tbody> 29 <tr th:each="post:${posts}" th:object="${post}"><!--Controllerから渡されたplayersに対してループ処理を行っている--> 30 31 <td th:text="*{id}"></td> 32 <td th:text="*{posted_statement}"></td> 33 <td th:text="*{username}"></td> 34 35 <td> 36 <form th:action="@{/posts/admin/{id}(id=*{id})}" th:method="delete"> 37 <input class="btn btn-default btn-xs" type="submit" value="削除" /> 38 </form> 39 </td> 40 </tr> 41 </tbody> 42 43 44 45 </table> 46</body> 47</html>

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

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

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

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

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

m.ts10806

2022/02/18 11:27

起きてる問題に対してタイトルが大きすぎる気がします。 可能なら内容に寄せてタイトル調整を。
hfm_225

2022/02/18 13:08

ご指摘ありがとうございます。 タイトルを見直し、変更いたしました。
guest

回答1

0

ベストアンサー

/posts/admin/{id}(id=*{id})

なのですから、マッピングにも[admin]が必要なのでは

Java

1@RequestMapping("/posts") 2public class PostController { 3 4@DeleteMapping("/{id}")

だと/posts/{id}ですので

Java

1@RequestMapping("/posts") 2public class PostController { 3 4@DeleteMapping("/admin/{id}")

投稿2022/02/18 11:26

m.ts10806

総合スコア80850

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

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

hfm_225

2022/02/18 12:58 編集

ご回答ありがとうございます、、、! 仰る通りでした、、、! /admin/{id}に修正したらページが見つからないという問題は解決いたしました。 ただ、次は Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Feb 18 21:44:15 JST 2022 There was an unexpected error (type=Method Not Allowed, status=405). Request method 'POST' not supported org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported というエラー表示がされてしまい、こちらも調べてみたのですが原因がわかりません、、、 許可されていないメソッドを使ってしまっているのでしょうか、、、? こちらもご教授いただきたいです、、、 よろしくお願いいたします。
m.ts10806

2022/02/18 13:00

ひとまず動作させたいだけなら DeleteMapping ↓ PostMapping ですかねぇ。
hfm_225

2022/02/18 13:16

ご回答ありがとうございます。 PostMappingに変更したところ404エラーが表示されました、、、 おそらくこちらも正しくマッピングができていないのだと思うのですが、、、 もう少し原因を探ってみようと思います、、、!
hfm_225

2022/02/18 13:38

PostMappingに修正後、admin.htmlのformタグをth:method="delete"からth:method="post"に修正、 Controllerのdestroyメソッド、return "redirect:/admin"をreturn "redirect:/posts/admin"に変更したところデータが削除されていました、、、! DeleteMappingなどはもう少し勉強しようと思います、、、 無事解決いたしました! ありがとうございます!
m.ts10806

2022/02/18 20:29 編集

確かにリクエストメソッドは処理にあったものが良いですが、 DELETEやPUTなどGET/POST以外はmethod=postの上で_methodという別のリクエストパラメータで疑似的に処理しているケースとなるので、そのあたりをおさえると良いかもしれません。
hfm_225

2022/02/21 04:55

ありがとうございます! まだ理解が足りていない部分があるのですが、m.ts10806様が仰っている内容はこちらの記事https://qiita.com/kazuhiro1982/items/b8b9965fddf9c5507517に書かれていることと同じでしょうか、、、?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問