Spring MVC中Thymeleaf用PATCH方法报错:POST方法不被支持
针对你遇到的Method 'POST' is not supported错误,按以下步骤排查解决:
1. 检查控制器路径映射是否匹配
你的控制器方法@PatchMapping("/{id}")如果没有在类上添加@RequestMapping("/people"),实际匹配的路径是/{id},但表单提交的路径是/people/{id},两者不匹配。Spring找不到对应PATCH方法的处理器,就会把原本被过滤器转换前的POST请求当成无效请求,抛出错误。
解决:
在控制器类上添加@RequestMapping("/people"),确保方法的路径最终为/people/{id},和表单的th:action一致。
2. 调整HiddenHttpMethodFilter的注册顺序
你当前的代码是先调用super.onStartup(aServletContext)初始化DispatcherServlet,再注册过滤器,这会导致过滤器在DispatcherServlet之后执行,请求已经被处理,无法完成HTTP方法转换。
修改MySpringMvcDispatcherServletInitializer的代码:
@Override public void onStartup(ServletContext aServletContext) throws ServletException { // 先注册过滤器,再初始化DispatcherServlet,确保过滤器先执行 registerHiddenFieldFilter(aServletContext); super.onStartup(aServletContext); } private void registerHiddenFieldFilter(ServletContext aContext) { FilterRegistration.Dynamic filter = aContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter()); filter.addMappingForUrlPatterns(null, true, "/*"); filter.setAsyncSupported(true); }
3. 确认Thymeleaf是否生成了_method隐藏字段
Thymeleaf的th:method="PATCH"应该自动生成<input type="hidden" name="_method" value="PATCH"/>,如果没有生成,过滤器无法识别要转换的方法。
检查方式:
打开浏览器的开发者工具,查看edit页面的HTML源码,确认是否存在该隐藏字段。如果没有,说明Thymeleaf版本不兼容Spring 6(Jakarta环境),需要升级Thymeleaf到3.1+版本:
<dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring6</artifactId> <version>3.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.1.2.RELEASE</version> </dependency>
4. 确保依赖版本适配Jakarta环境
- 确认使用Spring 6+版本(适配Jakarta Servlet 6.0),比如spring-webmvc依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.11</version> </dependency>
- 避免混合
javax和jakarta的依赖,确保所有Servlet相关依赖都是Jakarta版本。
内容的提问来源于stack exchange,提问作者Sabir Ali

