【问题标题】:Spring MVC Request method 'POST' not supported -> HTTP 405不支持 Spring MVC 请求方法“POST”-> HTTP 405
【发布时间】:2026-02-02 11:25:02
【问题描述】:

卡住了大约 4 个小时,想知道 Spring MVC/thymeleaf 应用程序中的错误在哪里。
我的本地目标是在主页提交登录/通过表单后呈现 admin.html。

控制器:

@Controller
public class HomeController {
        @GetMapping("/")
        public String getHome(Model m) {
            m.addAttribute( "user",new User());
            return "/home";
        }
        @PostMapping("/")
        public String getSubmit(@ModelAttribute User user){

            return "/admin";
        }
}

home.html:

  <form action="#" th:action="@{/admin}" th:object="${user}" method="post">
            <p class="txt">Name: <input type="text" th:field="*{name}"/></p>
            <p class="txt">Password: <input type="text" th:field="*{password}"/></p>
            <p><input class="button" type="submit" value="Submit" />
                <input class="button" type="reset" value="Reset" /></p>
        </form >

用户类别:

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private String password;
    private boolean isAdmin;
    private String address;
}

所以我搜索了很多想法,从 pom.xml 中删除了 spring 安全性,
尝试将 @RequestedMapping 与 RequestMethod.PUT 一起使用,- 没办法,它不起作用。

【问题讨论】:

  • th:action="@{/admin}" - 重定向到 api -> /admin 并且您在控制器中没有该 api?

标签: java spring spring-boot model-view-controller thymeleaf


【解决方案1】:

您的表单引用th:action="@{/admin}" 作为目标。您的控制器不会映射/admin,而只会映射根/

您必须将目标更改为/

如果你想渲染一个模板/admin,那么你的回报是正确的。如果你想重定向到/admin,那么一个新的控制器可能会处理这个问题,所以你必须改写redirect:/admin

【讨论】:

  • 更改目标不起作用。我写了 AdminController,但每次都添加新的 Controller 看起来很糟糕。还是谢谢!
【解决方案2】:

你的控制器应该是这样的:

@Controller
public class HomeController {
    @GetMapping("/")
    public String getHome(Model m) {
        m.addAttribute("user", new User());
        return "/home";
    }

    @PostMapping("/admin")
    public String getSubmit(User user) {   
        return "/admin";
    }
}

home.html 应该是这样的:

<form action="@{/admin}" th:object="${user}" method="post">
    <p class="txt">Name: <input type="text" th:field="*{name}"/></p>
    <p class="txt">Password: <input type="text" th:field="*{password}"/></p>
    <p><input class="button" type="submit" value="Submit" />
    <input class="button" type="reset" value="Reset"/></p>
</form >

【讨论】: