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

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

ただいまの
回答率

88.04%

Spring Boot(STS4)で編集後に保存ができない

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 360

score 24

分からないこと

springを学習しており、自作でブログアプリを作っています。

記事作成をして、編集画面まで行けるのですが、保存ボタンを押すと下記のエラー文が出てきてしまい、保存ができません。

エラー文

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Nov 05 18:22:24 JST 2020
There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'GET' not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:213)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:422)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:110)
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:59)
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:396)
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1234)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1016)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    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:626)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:94)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    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:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:832)

コード

コントローラー

package com.application.controller;

import org.springframework.beans.factory.annotation.
Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.application.models.BlogRepository;
import com.application.models.Blog;
import org.springframework.web.servlet.mvc.support.
RedirectAttributes;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.
PatchMapping;
import org.springframework.web.bind.annotation.
ModelAttribute;

@Controller
public class BlogController {

    private BlogRepository rep;

    @Autowired
    public BlogController(BlogRepository rep) {
        this.rep = rep;
    }

    @GetMapping("/")
    public String toppage(Model model) {
//        model.addAttribute("message", "トップページです");
        return "toppage";
    }

    @GetMapping("/list")
    public String list(Model model) {
        model.addAttribute("blogs", rep.findAll());
        return "list";
    }

    @GetMapping("/create")
    public String create(@ModelAttribute Blog blog, Model model) {
        return "create";
    }

    @PostMapping("/save")
    public String save(@ModelAttribute Blog blog, RedirectAttributes attrs) {
        rep.save(blog);
        attrs.addFlashAttribute("success", "データの登録に成功しました");
        return "redirect:/list";
    }

    @GetMapping("/show/{id}")
    public String show(@PathVariable int id, Model model) {
        Blog b = rep.findById(id).get();
        model.addAttribute("blog", b);
        return "show";
    }

    @GetMapping("/edit/{id}")
    public String edit(@PathVariable int id, Model model) {
        Blog b = rep.findById(id).get();
        model.addAttribute("blog", b);
        return "edit";
    }

    @PatchMapping("/update/{id}")
    public String update(@PathVariable int id, @ModelAttribute Blog blog, Model model, RedirectAttributes attrs) {
        blog.setId(id);
        rep.save(blog);
        attrs.addFlashAttribute("success", "データの更新に成功しました。");
        return "redirect:/list";
    }

}

HTML

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<link th:href="@{/css/style.css}" rel="stylesheet"/>
<title>記事作成</title>
</head>
<body>
  <header th:replace="/parts/parts :: common-header"></header>
  <div class="main">
    <div class="contents-wrapper">
      <div class="contents-title">
        <h1>ブログ編集</h1>
      </div>
      <div class="contents">
        <form method="patch" th:action="@{/update/{id}(id=${blog.id})}" th:object="${blog}">
          <div>
            <label for="title">タイトル</label>
            <input type="text" th:field="*{title}">
          </div>
          <div>
            <label for="content">本文</label>
            <input type="text" th:field="*{content}">
          </div>
          <input type="submit" value="送信">
        </form>
      </div>
    </div>
  </div>
</body>
</html>

参考書にGETやPOST以外のメソッドを使用するには。application.propertiesにspring.mvc.hiddenmethod.filter.enabled=true
を記載する必要があると書いてあったので、記載してます。

お分かりになる方がいらっしゃいましたら、ご教授いただければと思います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/11/05 19:13

    application.propertiesの内容も提示してください。
    また、「参考書」と「自身の環境」のバージョン合ってますか?
    結局はGETだと認識されているのは間違いないわけですから。
    正しく認識されていないorその設定は自身の環境では使えない 可能性を疑いましょう。

    キャンセル

  • miyazawakento

    2020/11/05 20:16

    ```
    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.url=jdbc:h2:mem:first-application
    spring.datasource.username=user
    spring.datasource.password=password
    spring.datasource.sql-script-encoding=UTF-8
    spring.datasource.initialization-mode=always
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.mvc.hiddenmethod.filter.enabled=true
    ```

    aplication.propertiesは上記の通りです。
    参考書に書いてあるアプリケーションは作成できたので、環境の問題ではないと思います

    キャンセル

  • m.ts10806

    2020/11/06 07:37

    >参考書に書いてあるアプリケーションは作成できた
    あ、いやそういうことじゃなくて。
    Springのバージョン違えばちょっとしたことで機能が使えなかったりするので、合わせるべきと言う話で(Javaとかに限らず全てに言えます)

    キャンセル

  • miyazawakento

    2020/11/06 10:08 編集

    はい

    キャンセル

回答 1

checkベストアンサー

+1

HTMLのmethodはGETとPOSTのみ許可されていますが、Thymeleafの属性では指定できるようになっています。

<form th:action="....." th:method="patch" .... > 

そのうえで、SpringBoot 2.2以降では spring.mvc.hiddenmethod.filter.enabled=true を記述します。(デフォルトがfalseになりました)

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#httphiddenmethodfilter-disabled-by-default

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/05 23:28

    ご回答ありがとうございます。
    method="patch"にthを付けたら正常に動作しました。

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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