Spring Employee实体API POST/PUT等请求返回405错误如何解决?
问题原因
你遇到的405错误(HttpRequestMethodNotSupportedException)为Spring MVC未匹配到对应HTTP方法的处理器导致,结合你提供的代码,常见诱因如下:
- 请求未携带正确的
Content-Type头:你的控制器中@PostMapping、@PutMapping、@PatchMapping均显式配置了consumes="application/json",仅接收请求头Content-Type为application/json的请求,若测试时未配置该头,会直接触发405错误。 - Spring Security CSRF拦截:若项目引入了Spring Security依赖,默认开启的CSRF防护会拦截所有非GET类型的请求,未携带合法CSRF Token的请求会被拦截返回405/403错误。
- 请求路径不匹配:你当前配置的
@PutMapping未绑定路径参数,仅匹配PUT /app-api/employees请求,若测试时发送PUT /app-api/employees/{id}这类带id的PUT请求,会找不到对应处理器。
解决方案
1. 配置正确的请求头
测试POST/PUT/PATCH请求时,在请求头中添加Content-Type: application/json即可匹配到对应接口。
2. 关闭CSRF防护(前后端分离场景适用)
如果是前后端分离项目无需CSRF防护,可新增Spring Security配置类关闭该功能:
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 关闭CSRF防护 http.csrf().disable() // 权限规则可根据自身业务调整 .authorizeRequests() .anyRequest().permitAll(); } }
如果项目未引入Spring Security依赖可跳过该步骤。
3. 调整接口路径适配业务需求
如果需要支持带id的PUT请求,可修改PutMapping配置:
@PutMapping(value = "/{id}", consumes="application/json") @ResponseStatus(HttpStatus.OK) public Employee update(@PathVariable("id") Long id, @RequestBody Employee employee) { employee.setEmployeeId(id); return empRepo.save(employee); }
接口映射参考
调整后各请求的对应映射如下:
| 请求方法 | 路径 | 功能 |
|---|---|---|
| GET | /app-api/employees | 查询所有员工 |
| GET | /app-api/employees/{id} | 查询指定ID员工 |
| POST | /app-api/employees | 新增员工 |
| PUT | /app-api/employees/{id} | 全量更新指定ID员工 |
| PATCH | /app-api/employees/{id} | 部分更新指定ID员工 |
| DELETE | /app-api/employees/{id} | 删除指定ID员工 |
内容的提问来源于stack exchange,提问作者Miki Ahmed
相关产品推荐
相关产品推荐

