Postman测试接口报405错误:Request method 'POST' not supported
POST请求返回405 "Request method 'POST' not supported" 报错排查与修复
核心报错原因
代码存在3个直接导致请求映射失效的问题,附带1个隐藏的运行时错误:
- 各层类名、方法定义不统一,Spring未正确注册POST接口映射
Controller、Service接口中使用Classes类作为方法入参、返回值,但实际定义的JPA持久化实体是ClassSubject;且Service实现类中没有实现接口定义的saveClass方法,仅写了updateClassSubject方法,Spring初始化时无法将标注了@PostMapping的方法绑定为可访问的接口处理器。 - JPA实体注解配置错误
实体类中@Column注解错误使用value属性指定列名,JPA规范中@Column指定数据库列名的属性为name,该配置错误会导致持久层绑定失败,间接影响接口初始化。 - 高版本Spring路径尾斜杠匹配规则变化
Spring Boot 2.6及以上版本默认关闭路径尾斜杠匹配,如果Postman请求的地址末尾多带了斜杠(比如请求/student_enrollment/class_subject/而非/student_enrollment/class_subject),会直接匹配不到对应请求方法,返回405。 - 隐藏问题:SQL建表语句的主键未配置自增,和JPA的
IDENTITY主键生成策略不匹配,即使接口调通,插入数据时也会报主键为空的错误。
修复步骤
- 统一全链路类名定义
对齐Controller、Service、持久层的类引用,由于数据库表名为class_subject,统一使用ClassSubject作为实体类名,同步修改Service接口、实现类、Controller中所有Classes的引用,确保Service实现类覆写所有接口定义的方法。
修正后的Service接口示例:
public interface ClassService { ClassSubject saveClass(ClassSubject classSubject); List<ClassSubject> getAllClasses(); ClassSubject getClassByID(int classId); ClassSubject updateClass(ClassSubject classSubject, int classId); void deleteClass(int classId); }
修正后的Controller POST方法:
@PostMapping public ResponseEntity<ClassSubject> saveClass(@RequestBody ClassSubject classSubject) { return new ResponseEntity<>(classService.saveClass(classSubject), HttpStatus.CREATED); }
- 修正JPA实体注解配置
将实体类中@Column的value属性替换为name:
@Data @Entity @Table(name = "class_subject") public class ClassSubject { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int subject_id; @Column(name = "prerequisite") private String prerequisite; @Column(name = "max_capacity") private int max_capacity; }
同步修正SQL建表语句,给主键添加自增属性:
CREATE TABLE class_subject( subject_id INT NOT NULL AUTO_INCREMENT, prerequisite VARCHAR(30), max_capacity INT NOT NULL, PRIMARY KEY (subject_id) );
- 校验请求路径与配置
Postman发起请求时使用不带尾斜杠的接口地址:http://<服务IP:端口>/student_enrollment/class_subject,请求头设置Content-Type: application/json,传入符合实体结构的JSON参数。如果需要兼容尾斜杠请求,可在application.yml中添加配置开启匹配:
spring: mvc: pathmatch: use-trailing-slash-match: true
- 启动校验
服务启动时查看控制台的请求映射日志,确认POST /student_enrollment/class_subject已绑定到对应方法后再发起测试即可。
内容的提问来源于stack exchange,提问作者Arturo A.
相关产品推荐
相关产品推荐

