首先,明确一点405问题就是浏览器端(或客户端)请求方法和服务端处理该路径的请求的处理方法不一致造成的。

背景:SpringBoot2.70整合JPA,测试单表的增删改查

现象: 在用postman测试delete方法的时候遇到的

图1: postman测试截图

图2:后端代码块

package com.xxxx.salesforecast.Controller;

import com.xxxx.salesforecast.pojo.User;

import com.xxxx.salesforecast.repository.UserRepository;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;

import java.util.List;

/**

* 用户外部接口

*

* @author : liuke

* @date : 2022-06-22 14:20

**/

@RestController

@RequestMapping("/user")

public class UserController {

@Autowired

private UserRepository userRepository;

/**

* 插入

*

* @param user

* @return

*/

@PostMapping

public String addUser(@RequestBody User user) {

userRepository.save(user);

return "success";

}

/**

* 查询全部

*

* @return

*/

@GetMapping("")

public List getAllUser() {

List userList = userRepository.findAll();

return userList;

}

/**

* 根据 id 删除

* @param id

* @return

*/

@DeleteMapping("/{id}")

public String deleteUserById(@PathVariable Integer id){

userRepository.deleteById(id.intValue());

return "success";

}

}

图三:控制台报错

排查解决过程: 第一步:大致检查一下自己代码,感觉没问题,开始百度 第二步:百度得到的第一个方案,未解决 application.yml中添加 spring mvc: hiddenmethod: filter: enabled: true 这个启动HiddenHttpMethodFilter过滤器,以支持浏览器可以发送DELETE PUT 请求。而我没用浏览器发送请求,而是用postman,所以无用也正常。

第三步:尝试将@DeleteMapping改成@RequestMapping,未解决

第四步:尝试去掉@PathVariable 注解,未解决

第五步:想到,我用的是restful接口,增删改查的路径都是一样,通过@PostMapping、@PutMapping、@DeleteMapping、@GeMapping来区分行为。

于是修改了方法的路径,还是不行。但是这个时候不报405了,开始报404了。 404,众所周知一定是没有匹配的路径。

然后我终于发现了问题的所在,下图路径 http://localhost:6060/user/delete?id=1 这里的id是以传参的形式 而@DeleteMapping(“/delete/{id}”)的意思是id当路径

所以路径改成

思考:那为什么之前都会报405的错误呢? 因为匹配到了查询的接口,这个接口就是@GetMapping,所以和@DeleteMapping并不一致,就报了405错误。

且这个接口不需要传参,如果传参了也是不会报错的,比如,我们访问http://baidu.com 和 http://baidu.com/?sbbaidu=1是一样的

总结: 问题出在我把@DeleteMapping(“/{id}”)的id当路径和路径传参弄混了。

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: