teratail header banner
teratail header banner
質問するログイン新規登録
Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

Q&A

解決済

2回答

960閲覧

データ保存後、詳細画面に遷移できない

kzr_ktr

総合スコア8

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

0グッド

2クリップ

投稿2022/09/30 02:11

0

2

前提

Springフレームワークを使用し、簡単なCRUDサイトを作成しています。
現在Create部分で詰まっています。

やりたい事

イメージ説明
このような一覧と投稿フォームがあるページで、投稿をすると投稿詳細画面に遷移するようにしたいです。

起こっている事

投稿フォームから投稿を行った際に、以下の様にエラーが起こり詳細画面に遷移できません

イメージ説明
Showリンクからアクセスした場合は、URLが「〜/books/1」など各idの詳細画面に遷移しますが、
投稿後に詳細画面に遷移する際には、URLが上の画像の様に「〜/books/show」となりエラーになっている状態です。
コードをどう書けば、投稿した際に、idの値を取得しページ遷移を完了させられるのかを教えていただきたいです。

該当のコード

java:BookController.java

1@Controller 2@RequestMapping("/books") 3public class BookController { 4 5 private final BookService bookService; 6 7 @Autowired 8 public BookController(BookService bookService) { 9 this.bookService = bookService; 10 } 11 12// 一覧画面 13 @GetMapping 14 public String index(BookForm bookForm, 15 BindingResult result, 16 Model model) { 17 List<Book> list = bookService.getAll(); 18 model.addAttribute("bookList", list); 19 return "books/index"; 20 } 21 22// 保存 23 @PostMapping("/complete") 24 public String complete(@Validated BookForm bookForm, 25 BindingResult result, 26 Model model, 27 RedirectAttributes redirectAttributes) { 28 if(result.hasErrors()) { 29 List<Book> list = bookService.getAll(); 30 model.addAttribute("bookList", list); 31 return "redirect:/books/index"; 32 } 33 Book book = new Book(); 34 book.setTitle(bookForm.getTitle()); 35 book.setBody(bookForm.getBody()); 36 bookService.save(book); 37// redirectAttributes.addAttribute("complete", "Book was successfully created."); 38 return "redirect:/books/show"; 39 } 40 41// 詳細画面 42 @GetMapping("/{show}") 43 public String confirm(Model model, 44 @PathVariable("show") int id, 45 @ModelAttribute("complete") String complete) { 46 Book book = bookService.findById(id); 47 model.addAttribute("bookData", book); 48 return "books/show"; 49 } 50 51}

java:BookServiceImpl.java

1@Service 2public class BookServiceImpl implements BookService { 3 4 private final BookDao dao; 5 6 @Autowired public BookServiceImpl(BookDao dao) { 7 this.dao = dao; 8 } 9 10 @Override 11 public void save(Book book) { 12 dao.insertBook(book); 13 } 14 15 @Override 16 public List<Book> getAll() { 17 return dao.getAll(); 18 } 19 20 @Override 21 public Optional<Book> getBook(int id) { 22 return dao.findById(id); 23 } 24 25 @Override 26 public Book findById(int id) { 27 return dao.findById(id).get(); 28 } 29 30}

html:index.html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Bookers</title> 6 </head> 7 <body> 8 <h1>Books</h1> 9 <table> 10 <thead> 11 <tr> 12 <th>Title</th> 13 <th>Body</th> 14 <th></th> 15 </tr> 16 </thead> 17 <tbody> 18 <tr th:each = "book : ${bookList}"> 19 <td th:text = "${book.title}">Title</td> 20 <td th:text = "${book.body}">Body</td> 21 <td> 22 <a th:href="@{/books/{id}(id=${book.id})}">Show</a> 23 <a>Edit</a> 24 <a>Destroy</a> 25 </td> 26 </tr> 27 </tbody> 28 </table> 29 30 <h2>New book</h2> 31 <form method="post" action="#" th:action="@{/books/complete}" th:object="${bookForm}"> 32 <label for="title">Title</label><br> 33 <input id="title" name="title" type="text"><br> 34 <input type="hidden" name="title" th:value="*{title}"> 35 <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}"></div> 36 <label for="body">Body</label><br> 37 <input id="body" name="body" type="text"><br> 38 <input type="hidden" name="body" th:value="*{body}"> 39 <div th:if="${#fields.hasErrors('body')}" th:errors="*{body}"></div> 40 <input type="submit" value="Create Book"> 41 </form> 42 </body> 43</html>

html:show.html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Bookers</title> 6 </head> 7 <body> 8 <p th:text="${complete}"></p> 9 <div th:object="${bookData}"> 10 <h1 th:text="*{title}"></h1> 11 <p th:text="*{body}"></p> 12 </div> 13 <a>Edit</a> | <a th:href="@{/books}">Back</a> 14 </body> 15</html>

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

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

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

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

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

jimbe

2022/09/30 02:22

スタックトレース等のテキストは画像では無くテキストをコピペしてください。画像では見難い環境があります。
kzr_ktr

2022/09/30 02:33

質問欄に貼れなかったのでこちらに貼っておきます。よろしくお願いします。 ```エラーコード Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Sep 30 11:24:24 JST 2022 There was an unexpected error (type=Bad Request, status=400). Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "show" org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "show" at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:133) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.NumberFormatException: For input string: "show" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.base/java.lang.Integer.parseInt(Integer.java:652) at java.base/java.lang.Integer.valueOf(Integer.java:983) at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:211) at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115) at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:429) at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:402) at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:155) at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73) at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53) at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:729) at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125) ... 47 more ```
Crimson_Tide

2022/09/30 03:33

> Book book = new Book(); > book.setTitle(bookForm.getTitle()); > book.setBody(bookForm.getBody()); > bookService.save(book); 提示ソース不足で不明ですが、新規生成時にbook.idを新規に生成して登録する処理はありますか?
guest

回答2

0

自己解決

一旦、質問を取り下げます。

投稿2022/10/02 01:20

kzr_ktr

総合スコア8

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

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

0

@GetMapping("/{show}")

マッピングがこうなっているので

return "redirect:/books/show";

ではなく

return "redirect:/books/"+生成したデータのID;

とする必要があるのではと。

投稿2022/09/30 02:15

編集2022/09/30 23:14
m.ts10806

総合スコア80888

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

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

kzr_ktr

2022/09/30 02:38

上記の様に return "redirect:/books/"+生成したデータのID; に変更を行いました。 return "redirect:/books/" + book.getId(); としました。 ただその場合だとURLが「~/books/0」となりエラーとなります。 本当に無知で申し訳ありませんが、さらに詳しく教えていただいてもよろしいですか?
m.ts10806

2022/09/30 02:44

どういうエラーでしょう。 ただ、1つ言えるのはBookオブジェクトはあくまで入力データを保持してsaveに渡すためのオブジェクトであり、 saveの実行結果を保持しているクラスではないのではと。 saveの返却値を生成されたIDとするように修正してください。 BookService側の処理も生成データのIDを取得するように改修必要と思います。
m.ts10806

2022/09/30 23:15

>低評価された方 理由のコメントを。 起きている現象の解決には繋がる回答です。 そうでないと感じた理由を技術的な観点で述べてください。 それをしないなら単なる嫌がらせです。即刻やめてください。
kzr_ktr

2022/10/01 01:48 編集

返信遅くなり申し訳ありません。 エラーの内容は、book.getId()としていた為、保存はできているが、Postされた詳細画面ではなく「id=0」の詳細画面に遷移されてしまうエラーです。 BookService側の処理が ```BookService.java public Book findById(int id) { return dao.findById(id).get(); } ``` にしているのですが、これではidは取得できないのでしょうか? とあるカリキュラムを見よう見まねで書き込んだので、メゾットの役割があまり理解できていません、、、
m.ts10806

2022/10/01 02:52

それはエラーではなく想定の動作をしていないだけなのでちょっと違います。 findByIdというメソッドもidが判明していないとexeception返すのでは? 欲しいのはsaveのときに生成されたidのはずです。 idをどう採番しているのか提示内容では分かりませんが、DBのオートインクリメントであればlast insert idなど、別途取得する機能を使う必要があります。 細かくて申し訳ないですが、メソッドです。
kzr_ktr

2022/10/02 01:19

私の知識が浅すぎて、解決に至らないと感じたので一旦、質問を取り下げたいと思います。 もう一度、学習し直して出直したいと思います。 m.ts 10806さん、お手数お掛けして申し訳ございませんでした。
m.ts10806

2022/10/02 02:36

「取り下げ」で自己解決だと回答になってないので、締め方はよろしくないと思います。 データの流れをひとつひとつ追っていけばそこまで難解ではなかったりします。 場面で必用なデータが何で、それをどう取り出すのか(もしくは既にあるデータから参照するのか)を実装前に決めましょう。 学習はもちろん大事ですが、データの流れを整理して設計におこすのも大事です。行き当たりばったりでは熟練者でもまともなものは作れませんので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問