Spring MVC中HiddenHttpMethodFilter不生效,@PatchMapping报405错误
解决Spring MVC中@PatchMapping返回405的问题
检查HiddenHttpMethodFilter的配置方式
不同Spring版本的配置逻辑不一样,别照搬旧教程的写法:
- Spring Boot 2.x及以上:无需手动注册Filter,只需在配置文件开启开关即可,手动注册反而可能因顺序问题失效:
spring.mvc.hiddenmethod.filter.enabled=true - 纯Spring MVC(非Boot):要在web.xml里注册Filter,且顺序要优先于其他业务Filter:
用Java配置的话,需在WebConfig类中声明Bean:<filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>@Configuration public class WebConfig implements WebMvcConfigurer { @Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { return new HiddenHttpMethodFilter(); } }
验证请求参数的正确性
虽然浏览器能看到隐藏字段,但要确认_method参数值是大写的PATCH——Thymeleaf的th:method="patch"会自动转大写,但可以通过浏览器开发者工具的Network标签,查看请求的Form Data里是否明确存在_method: PATCH。
核对控制器方法的映射规则
确保控制器的@PatchMapping路径和表单的action完全匹配,比如表单action="/user/1",控制器要写@PatchMapping("/user/{id}"),避免路径拼写偏差。同时检查方法参数绑定是否正常,比如路径变量、请求体的接收逻辑有没有问题。
排查Filter的执行顺序
如果项目里有其他Filter(如权限校验、编码处理Filter),HiddenHttpMethodFilter必须排在这些Filter之前执行,否则请求被其他Filter处理后,_method参数可能被提前消费或修改,导致无法完成请求方法转换。
直接测试PATCH请求
用Postman等工具直接发送PATCH请求到控制器路径,如果能正常响应,说明问题确实出在HiddenHttpMethodFilter的配置上;如果仍返回405,要检查控制器是否存在重复映射,或是Spring MVC配置中禁用了PATCH方法。
内容的提问来源于stack exchange,提问作者Yung Choppa
相关产品推荐
相关产品推荐

