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

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

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

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

Spring

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

Spring Boot

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

解決済

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

kzr_ktr
kzr_ktr

総合スコア8

Java

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

Spring

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

Spring Boot

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

2回答

0リアクション

2クリップ

326閲覧

投稿2022/09/30 02:11

前提

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

やりたい事

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

起こっている事

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

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

該当のコード

java:BookController.java

@Controller @RequestMapping("/books") public class BookController { private final BookService bookService; @Autowired public BookController(BookService bookService) { this.bookService = bookService; } // 一覧画面 @GetMapping public String index(BookForm bookForm, BindingResult result, Model model) { List<Book> list = bookService.getAll(); model.addAttribute("bookList", list); return "books/index"; } // 保存 @PostMapping("/complete") public String complete(@Validated BookForm bookForm, BindingResult result, Model model, RedirectAttributes redirectAttributes) { if(result.hasErrors()) { List<Book> list = bookService.getAll(); model.addAttribute("bookList", list); return "redirect:/books/index"; } Book book = new Book(); book.setTitle(bookForm.getTitle()); book.setBody(bookForm.getBody()); bookService.save(book); // redirectAttributes.addAttribute("complete", "Book was successfully created."); return "redirect:/books/show"; } // 詳細画面 @GetMapping("/{show}") public String confirm(Model model, @PathVariable("show") int id, @ModelAttribute("complete") String complete) { Book book = bookService.findById(id); model.addAttribute("bookData", book); return "books/show"; } }

java:BookServiceImpl.java

@Service public class BookServiceImpl implements BookService { private final BookDao dao; @Autowired public BookServiceImpl(BookDao dao) { this.dao = dao; } @Override public void save(Book book) { dao.insertBook(book); } @Override public List<Book> getAll() { return dao.getAll(); } @Override public Optional<Book> getBook(int id) { return dao.findById(id); } @Override public Book findById(int id) { return dao.findById(id).get(); } }

html:index.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Bookers</title> </head> <body> <h1>Books</h1> <table> <thead> <tr> <th>Title</th> <th>Body</th> <th></th> </tr> </thead> <tbody> <tr th:each = "book : ${bookList}"> <td th:text = "${book.title}">Title</td> <td th:text = "${book.body}">Body</td> <td> <a th:href="@{/books/{id}(id=${book.id})}">Show</a> <a>Edit</a> <a>Destroy</a> </td> </tr> </tbody> </table> <h2>New book</h2> <form method="post" action="#" th:action="@{/books/complete}" th:object="${bookForm}"> <label for="title">Title</label><br> <input id="title" name="title" type="text"><br> <input type="hidden" name="title" th:value="*{title}"> <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}"></div> <label for="body">Body</label><br> <input id="body" name="body" type="text"><br> <input type="hidden" name="body" th:value="*{body}"> <div th:if="${#fields.hasErrors('body')}" th:errors="*{body}"></div> <input type="submit" value="Create Book"> </form> </body> </html>

html:show.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Bookers</title> </head> <body> <p th:text="${complete}"></p> <div th:object="${bookData}"> <h1 th:text="*{title}"></h1> <p th:text="*{body}"></p> </div> <a>Edit</a> | <a th:href="@{/books}">Back</a> </body> </html>

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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を新規に生成して登録する処理はありますか?

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Spring

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

Spring Boot

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