Spring Boot使用@PutMapping/@DeleteMapping仍报405 GET不支持问题
405 请求方法不支持问题解决方案
核心原因
你遇到的报错是因为发起请求的方法和后端接口允许的方法不匹配,具体有以下几点问题和对应解决方式:
1. 直接地址栏访问的请求方式错误
浏览器地址栏手动输入地址访问时,默认只会发起GET请求,而你晋升用户的接口用了@PutMapping(仅支持PUT请求),删除接口用了@DeleteMapping(仅支持DELETE请求),自然会触发405错误。
如果要测试非GET接口,可以用Postman、Apifox等接口测试工具,手动指定请求方法为PUT/DELETE调用。
2. HTML原生表单不支持PUT/DELETE请求
如果你是通过页面表单触发操作,原生HTML表单只支持GET和POST两种方法,要适配PUT/DELETE请求需要做如下配置:
- Spring Boot 2.2+版本默认已经自动开启
HiddenHttpMethodFilter,直接在表单中添加隐藏域即可:<!-- 晋升用户的表单示例 --> <form method="post" th:action="@{/Admin/users/{name}(name=${user.username})}"> <!-- 隐藏域指定真实请求方法 --> <input type="hidden" name="_method" value="put"> <input type="hidden" name="role" value="ADMIN"> <button type="submit">晋升为管理员</button> </form> - 如果是AJAX调用,直接指定请求方法为PUT/DELETE即可,不需要额外配置。
3. 现有接口代码存在参数绑定错误
你写的promoteUser方法没有正确接收路径参数,修正后的代码如下:
@PutMapping("/users/{username}") // 加@PathVariable接收路径上的用户名,加@ResponseBody直接返回字符串不走视图解析 @ResponseBody public String promoteUser(@PathVariable String username, User newUser){ User user = userService.findUserByUserName(username); user.setRole(newUser.getRole()); return "Promotion confirmed"; }
如果你的接口都是操作类接口不需要返回页面,建议直接把类上的@Controller改成@RestController,就不需要每个方法单独加@ResponseBody了。
内容的提问来源于stack exchange,提问作者seanhungerford
相关产品推荐
相关产品推荐

