Thymeleaf th:method="put"提交报405 POST方法不支持错误
问题根因
浏览器原生表单仅支持GET、POST两种提交方法,Thymeleaf的th:method="put"逻辑是:将表单实际提交方法设为POST,同时自动生成name="_method" value="put"的隐藏域传递真实请求方法。但Spring MVC默认未开启隐藏域方法转换的过滤器,不会读取这个_method参数做请求方法转换,只会按实际的POST请求匹配路由,找不到对应@PostMapping就会返回405错误。
正确使用
@PutMapping的配置方式 不需要修改控制器的@PutMapping注解,按你使用的框架版本开启对应配置即可:
- Spring Boot 2.x 版本:直接在配置文件开启隐藏方法过滤器开关
# application.yml 配置 spring: mvc: hiddenmethod: filter: enabled: true
# application.properties 配置 spring.mvc.hiddenmethod.filter.enabled=true
- Spring Boot 3.x 版本:除开启上述配置外,若过滤器未自动注册,手动添加Bean注册即可
@Configuration public class WebConfig { @Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { return new HiddenHttpMethodFilter(); } }
- 非Boot原生Spring MVC项目:在Web配置类或web.xml中手动注册
HiddenHttpMethodFilter,确保该过滤器优先级高于请求处理逻辑,能优先读取_method参数完成请求方法转换。
注意事项
如果项目集成了Spring Security,需确认安全配置没有拦截、移除_method表单参数,部分自定义安全规则会默认过滤非白名单表单参数,导致方法转换逻辑失效。
配置完成后重启服务,提交表单时Spring会自动将携带_method=put的POST请求转换为PUT请求,即可正常匹配你写的@PutMapping("/{id}")接口。
内容的提问来源于stack exchange,提问作者Mehdi Rahimi
相关产品推荐
相关产品推荐

