Spring Boot整合Thymeleaf提交表单报405 POST方法不支持问题求助
问题根因与解决方法
核心错误1:控制器类的路径前缀配置错误
@Controller("/user")的参数是Spring容器中该Bean的名称,并非请求路径前缀。你需要在类上额外添加@RequestMapping("/user")注解配置全局路径前缀,否则你的/add接口实际访问路径为/add,和前端表单提交的/user/add路径不匹配,Spring找不到对应POST请求的处理器就会抛出405错误。核心错误2:接口请求方法未明确指定
你当前的@RequestMapping(value = "/add")默认支持所有HTTP请求方法,建议显式使用@PostMapping("/add")注解指定该接口仅接收表单POST提交,避免歧义。
修改后控制器参考代码
@Controller @RequestMapping("/user") // 类层面配置路径前缀 public class UserController { @Autowired private UserService userService; @Autowired private ModelMapper modelMapper; // 显式指定接收POST请求 @PostMapping("/add") public String addUser(@ModelAttribute("user") final UserDto userDto) { userService.save(modelMapper.map(userDto, User.class)); // 提交完成后建议使用重定向,避免用户刷新页面重复提交表单 return "redirect:/user"; } // 对应返回用户表单页面的GET接口,确保能正常渲染带user对象的页面 @GetMapping public String initUserPage(Model model) { model.addAttribute("user", new UserDto()); return "user"; } }
额外注意事项
如果后续修改后出现403错误,是Spring Security默认开启CSRF防护导致的,只需在form表单内添加CSRF隐藏域即可:
<form th:action="@{/user/add}" th:object="${user}" method="post"> <!-- 新增CSRF token隐藏域 --> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> <!-- 原有表单内容保持不变 --> <label for="fullName">Full Name</label> <input id="fullName" class="form-control form-group" type="text" th:field="*{fullName}"> <label for="email">Email</label> <input id="email" class="form-control form-group" type="email" th:field="*{email}"> <label for="password">Password</label> <input id="password" class="form-control form-group" type="password" th:field="*{password}"> <p> <button class="form-group form-control btn btn-primary" type="submit" value="Submit">Submit</button> </p> </form>
内容的提问来源于stack exchange,提问作者Christiaan
相关产品推荐
相关产品推荐

