使用@RequestMapping(DELETE)时遇405错误:GET方法不被支持
我之前也碰到过一模一样的坑!明明指定了RequestMethod.DELETE却收到GET不支持的提示,大概率是请求实际没按DELETE方式发送,或者有其他配置细节没注意到,给你几个排查方向:
先确认你发送的请求真的是DELETE方法:
很多人习惯用浏览器地址栏直接访问接口,这默认是GET请求,肯定会触发405。你可以用Postman、curl这类工具来测试:curl -X DELETE http://your-server-ip:port/deletetest如果是前端调用,要确保请求方法明确设置为DELETE,比如用axios的话:
axios.delete('/deletetest').then(res => { ... })排查是否存在路径冲突的映射:
检查你的控制器类或者其他控制器里,有没有其他方法也映射到了/deletetest但用了GET方法?比如:@RequestMapping(value = "/deletetest", method = RequestMethod.GET) public String someGetMethod() { ... }不过这种情况如果有GET映射的话,请求GET不会返回405,反而会正常匹配。所以更可能是你误以为发的是DELETE,实际发送的是GET请求。
如果是通过HTML表单提交,要开启
HiddenHttpMethodFilter:
HTML表单默认只支持GET和POST方法,如果想用表单提交DELETE请求,需要在表单里加一个隐藏域:<form action="/deletetest" method="POST"> <input type="hidden" name="_method" value="DELETE"> <button type="submit">删除</button> </form>同时要在Spring配置中开启
HiddenHttpMethodFilter,它会把带有_method参数的POST请求转换成对应的DELETE方法。检查类级别和方法级别的@RequestMapping拼接是否正确:
如果你的控制器类上有@RequestMapping("/api"),那方法的实际访问路径是/api/deletetest,而不是根路径的/deletetest。如果你访问的是错误的路径,Spring找不到对应的DELETE映射,容器可能会返回405错误。查看Spring MVC的调试日志:
开启Spring MVC的DEBUG级别日志,你能看到请求的详细处理过程:比如请求方法是什么、匹配到了哪个控制器方法、有没有被拦截器处理。日志里会明确告诉你为什么返回405,这是最直接的排查方式。
内容的提问来源于stack exchange,提问作者yongchang

