Spring Boot中使用Postman调用PUT接口出现Error 405问题求助
调用POST、GET、DELETE接口均正常,但通过Postman调用PUT接口更新人员信息时,返回405错误,日志提示Request method 'PUT' is not supported。
控制器代码
@RequestMapping("api/v1/person") @RestController public class PersonController { private final PersonService personService; @Autowired public PersonController(PersonService personService) { this.personService = personService; } @PutMapping public void updatePerson(@PathVariable("id") UUID id, @RequestBody Person personToUpdate){ personService.updatePerson(id, personToUpdate); } }
Service与DAO层代码
Service层
public int updatePerson(UUID id, Person newPerson){ return personDao.updatePersonById(id, newPerson); }
DAO层
@Override public int updatePersonById(UUID id, Person update) { return selectPersonById(id) .map(person -> { int indexOfPersonToUpdate = DB.indexOf(person); if (indexOfPersonToUpdate >= 0){ DB.set(indexOfPersonToUpdate,new Person(id, update.getName())); return 1; } return 0; }) .orElse(0); }
错误日志
2023-07-09T16:51:04.651+02:00 DEBUG 35932 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : PUT "/api/v1/person/ef462667-fbc2-4587-8099-73475e68f33c", parameters={}
2023-07-09T16:51:04.655+02:00 WARN 35932 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' is not supported]
2023-07-09T16:51:04.655+02:00 DEBUG 35932 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed 405 METHOD_NOT_ALLOWED
2023-07-09T16:51:04.659+02:00 DEBUG 35932 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for PUT "/error", parameters={}
2023-07-09T16:51:04.660+02:00 DEBUG 35932 --- [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2023-07-09T16:51:04.664+02:00 DEBUG 35932 --- [nio-8080-exec-4] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'application/json', given [/] and supported [application/json, application/*+json]
2023-07-09T16:51:04.665+02:00 DEBUG 35932 --- [nio-8080-exec-4] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [{timestamp=Sun Jul 09 16:51:04 CEST 2023, status=405, error=Method Not Allowed, path=/api/v1/person/ (truncated)...]
2023-07-09T16:51:04.673+02:00 DEBUG 35932 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 405
项目依赖(pom.xml)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
核心问题是PUT接口的映射路径未包含路径变量id:
当前@PutMapping未指定路径,映射的是/api/v1/person,但实际调用的是/api/v1/person/{id},Spring无法匹配到对应的PUT接口,因此返回405错误。
修改控制器的PUT方法,在@PutMapping中添加路径变量:
@PutMapping("/{id}") public void updatePerson(@PathVariable("id") UUID id, @RequestBody Person personToUpdate){ personService.updatePerson(id, personToUpdate); }
修改后,PUT请求/api/v1/person/ef462667-fbc2-4587-8099-73475e68f33c就能正确匹配到该接口,不会再出现405错误。
其他接口(POST/GET/DELETE)正常是因为它们的映射路径正确包含了对应参数(比如DELETE方法应该配置了@DeleteMapping("/{id}"))。
内容的提问来源于stack exchange,提问作者Dylan Lam

