记录:Restful风格CRUD因2.2.2版本更新出现的Delete方式请求报错POST方法无效问题
首先,对在上篇中 diss SpringBoot2.0以下版本表示悔恨。。。
在进行SpringBoot项目学习开发的时候,在1.5.9版本主类无法运行且没有解决的情况下,与教程相背,擅用了SpringBoot2.2.2版本。(还沾沾自喜。。呵)
在用Restful风格的CRUD进行编写的过程中,Delete业务出现问题,下面进行记录解决。
前情提要:
删除按钮自定义了del_uri标签可以发起带有指定员工id的请求。
<button th:attr="del_uri=@{/emp/}+${emp.id}" class="btn btn-sm btn-danger deleteBtn">删除</button>
在主页面外定义一个不会显示任何东西的form表单:
form表单的提交方式为post;
里面的input框不显示;name必须为_method,这是SpringBoot自动配置文件中写好的;
value为提交请求的方式,这里是删除功能,对应delete,不区分大小写。
<form id="deleteEmpForm" method="post">
<input type="hidden" name="_method" value="delete"/>
</form>
下面是js代码:
获取class添加点击功能;
点击button触发form表单的提交事件,以del_uri发起请求。
<script>
$(".deleteBtn").click(function(){
//删除当前员工的
$("#deleteEmpForm").attr("action",$(this).attr("del_uri")).submit();
return false;
});
</script>
后端代码Controller:
// 员工删除
@DeleteMapping("/emp/{id}")
public String deleteEmployee(@PathVariable("id") Integer id){
// System.out.println("即将删除的用户的id为:"+id);
employeeDao.delete(id);
return "redirect:/emps"; //重定向回列表页面
}
错误出现
在员工列表页面点击删除按钮:
出现如下错误,POST请求不被支持。。。
我就纳闷了,都是照着教程一行一行写的怎么我就不行。。。
下面在Controller中写了一行控制台输出,发现根本没有运行到后端的方法中;那就是表单提交的时候就失败了。
之前SpringMVC发送一个请求的时候:
1、要配置HiddenHttpMethodFilter;而在SpringBoot中是自动配饰好的;
2、创建一个post表单;
3、创建一个input项,name="_method";值就是指定的请求方式。
HiddenHttpMethodFilter是干嘛的?
就是将我们的请求转成指定的方式;就是上面input中的value=“delete”
这个Filter会获取_method的值,下图代码中的paramValue
代表新的请求方式的值,就是我们所指定的。
所以说整个请求的完成过程高度依赖于这个HiddenHttpMethodFilter
而Spring Boot已经给我们配置好了,去WebMvcAutoConfiguration
看一下:
等一下!!为什么matchIfMissing = false
????这意味着什么?
这表示Spring Boot 默认情况下认为HiddenHttpMethodFilter
这个组件是存在的;而只有它不存在,Spring Boot才会把它注入到容器内。
也就是说当前容器中并没有这个组件,上述请求也就无法完成;就不难解释为什么POST请求不被允许了;
同样的事情在配置文件中也可以看到:
而Spring Boot1.5.10中却没有进行默认配置:
解决方案:
很简单,把这个组件注入到容器中就OK了。。。
源文件自然是不能修改的,直接去主配置文件中开启这个组件(百度可得 ~ 嘿嘿)
#开启组件
spring.mvc.hiddenmethod.filter.enabled=true
再一次验证他的默认值是false
问题解决,删除成功。。。