405 method not allowed表示请求方法不被支持,主因是@requestmapping等注解限定的http方法与客户端实际请求方式不匹配,需检查注解配置、统一捕获异常并友好响应,同时排查前端method大小写、表单路径及cors预检问题。

当 Spring MVC 接收到一个 HTTP 请求,但该请求的 Method(如 POST、GET、DELETE)不被当前控制器方法支持时,会抛出 HttpRequestMethodNotSupportedException,HTTP 状态码为 405 Method Not Allowed。这不是程序 bug,而是明确的语义错误,处理重点在于:提前预防 + 友好响应。
检查 @RequestMapping 或其派生注解是否匹配请求方式
这是最常见原因。比如控制器方法只标注了 @GetMapping,但前端发来的是 POST 请求,就会触发 405。
- 确认方法上使用了正确的注解:
@GetMapping/@PostMapping/@PutMapping/@DeleteMapping等,而非笼统的@RequestMapping(除非显式指定了method = RequestMethod.POST等) - 如果用了
@RequestMapping,务必检查method属性是否涵盖实际请求方式,例如:@RequestMapping(value = "/api/user", method = {RequestMethod.GET, RequestMethod.POST}) - 注意大小写和拼写:前端发的是
post还是POST?Spring 默认严格匹配大写的标准方法名
统一捕获并返回自定义错误响应
即使逻辑正确,用户或第三方可能误发请求。建议全局捕获该异常,避免暴露堆栈信息。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在全局异常处理器(
@ControllerAdvice类)中添加方法:
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseBody
public ResponseEntity<errorresponse> handleMethodNotSupported(
HttpRequestMethodNotSupportedException ex, HttpServletRequest request) {
String method = ex.getMethod();
String[] supportedMethods = ex.getSupportedMethods();
String message = String.format("不支持的请求方式: %s。支持的方式: %s",
method, Arrays.toString(supportedMethods));
ErrorResponse error = new ErrorResponse(405, "Method Not Allowed", message);
return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).body(error);
}</errorresponse>
-
ErrorResponse是你自定义的统一错误响应结构,包含状态码、错误码、提示信息等 - 返回
ResponseEntity并显式设置HttpStatus.METHOD_NOT_ALLOWED,确保响应头中的Status: 405正确
检查前端请求是否误配 method 或 URL
后端没问题,问题常出在前端调用侧:
- AJAX 请求中
method字段写错,例如本该用"POST"却写了"Post"或"post" - 表单提交(
<form method="post"></form>)未加th:action或路径拼错,导致提交到一个只支持 GET 的接口 - REST 客户端(如 Postman、curl)手动设置了错误的 Method,或缓存了旧请求配置
- 网关或反向代理(如 Nginx)重写了 method(极少见,但需排查)
补充:允许 OPTIONS 预检请求(CORS 场景)
如果项目启用了 CORS,浏览器对非简单请求会先发 OPTIONS 预检。若控制器没支持 OPTIONS,也可能报 405。
- 推荐让 Spring Boot 自动处理:确保
spring.mvc.dispatch-options-request=true(默认为 true) - 或在接口上显式支持:
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS}) - 更规范的做法是配置全局 CORS,由框架自动响应 OPTIONS 请求,无需每个接口额外声明
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










