Spring Boot控制器PUT请求报405错误:Request method 'PUT' not supported
Spring Boot PUT接口返回405错误排查
我在Spring Boot的控制器中添加了PUT方法,但访问该接口时返回405(Method Not Allowed)错误,控制台打印错误信息“Request method 'PUT' not supported”。另有一个控制器的PUT请求可正常工作,附上相关代码、日志及配置寻求技术帮助。
MainsiteController代码
@RestController @RequestMapping("/mainsite") public class MainsiteController { private MainsiteService mainsiteService; @Autowired public MainsiteController(MainsiteService mainsiteService) { this.mainsiteService = mainsiteService; } @PutMapping("{id}") public Mainsite updateMainsite(@PathVariable("id") Long id, @RequestBody Mainsite mainsite) { return mainsiteService.updateMainsite(id, mainsite); } }
控制台日志
[2m2022-11-20 17:47:49.587[0;39m [32mDEBUG[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.s.web.servlet.DispatcherServlet [0;39m [2m:[0;39m PUT "/api/v1/mainsite?id=1", parameters={masked} [2m2022-11-20 17:47:49.592[0;39m [33m WARN[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36m.w.s.m.s.DefaultHandlerExceptionResolver[0;39m [2m:[0;39m Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported] [2m2022-11-20 17:47:49.592[0;39m [32mDEBUG[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.s.web.servlet.DispatcherServlet [0;39m [2m:[0;39m Completed 405 METHOD_NOT_ALLOWED [2m2022-11-20 17:47:49.595[0;39m [32mDEBUG[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.s.web.servlet.DispatcherServlet [0;39m [2m:[0;39m "ERROR" dispatch for PUT "/api/v1/error?id=1", parameters={masked} [2m2022-11-20 17:47:49.596[0;39m [32mDEBUG[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36ms.w.s.m.m.a.RequestMappingHandlerMapping[0;39m [2m:[0;39m Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest) [2m2022-11-20 17:47:49.613[0;39m [32mDEBUG[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.s.w.s.m.m.a.HttpEntityMethodProcessor [0;39m [2m:[0;39m Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json] [2m2022-11-20 17:47:49.616[0;39m [32mDEBUG[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.s.w.s.m.m.a.HttpEntityMethodProcessor [0;39m [2m:[0;39m Writing [{timestamp=Sun Nov 20 17:47:49 CET 2022, status=405, error=Method Not Allowed, path=/api/v1/mainsite (truncated)...] [2m2022-11-20 17:47:49.640[0;39m [32mDEBUG[0;39m [35m10420[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.s.web.servlet.DispatcherServlet [0;39m [2m:[0;39m Exiting from "ERROR" dispatch, status 405
application.properties配置
server.servlet.context-path=/api/v1
问题原因及解决方案
问题根源
从日志可以看到,实际请求的路径是PUT "/api/v1/mainsite?id=1",也就是把id作为查询参数传递,但控制器中定义的@PutMapping("{id}")要求id是路径变量(即URL路径的一部分,格式为/mainsite/1)。Spring无法找到匹配的PUT映射,因此返回405错误。
解决办法
方法1:修改请求路径(推荐)
保持控制器代码不变,将请求路径改为:
PUT /api/v1/mainsite/1
这样id=1会作为路径变量被@PathVariable正确解析。
方法2:修改控制器适配查询参数
如果需要保留查询参数的传递方式,修改控制器的注解和参数:
@RestController @RequestMapping("/mainsite") public class MainsiteController { private MainsiteService mainsiteService; @Autowired public MainsiteController(MainsiteService mainsiteService) { this.mainsiteService = mainsiteService; } // 移除路径变量,改用查询参数 @PutMapping public Mainsite updateMainsite(@RequestParam("id") Long id, @RequestBody Mainsite mainsite) { return mainsiteService.updateMainsite(id, mainsite); } }
这样就能匹配PUT "/api/v1/mainsite?id=1"的请求。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

