在RESTful风格中,我们会将原本的GET,POST方法通过HiddenHttpMethodFilter
过滤器和隐藏域 转换为 对应的方法。
但实际上,实际写代码会总出错。出现如:
Request method 'PUT' not supported
或Request method 'DELETE' not supported
。对于这种错误,现在进行如下总结:
一: 比对URI
GET,POST,PUT,DELETE, Spring都支持,不要怀疑Spring, 可能是前端发送的rest 请求和后端的响应不匹配,
比如,我在遇到一个Request method 'DELETE' not supported
时,在点击删除时,传递的URI应该是xxx/emp/1005
,也就是说后面是带id号的,在我认真检查之后,发现在Handler的方法中,在@RequestMapping
的映射中,我忘记写占位符了{id},导致uri:/emp
没有匹配的前端的REST请求/emp/1005
。
@RequestMapping(value = "/emp/{id}",method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id) {
employeeDao.delete(id);
return "redirect:/emps";
}
二:没有使用绝对路径
如果你说我的占位符已经添加了,但是还是有问题,那怎么办?
比如我就遇到一个修改用的操作,结果出现Request method 'POST' not supported
我的占位符也写了,但是还是有问题。
@RequestMapping(value = "/emp/{id}",method = RequestMethod.GET)
public String input(@PathVariable("id") Integer id,Map<String,Object> map) {
map.put("employee",employeeDao.get(id));
map.put("departments",departmentDao.getDepartments());
return "input";
}
我们还是要检查:前端发送的rest 请求和后端的响应匹配否?。
通过检查,发现我们原本的路径xxx/emp/001
跳转变为xxx/emp/emp
这就是因为请求页面的form标签的action不是绝对路径。在实际开发中,我们都要写绝对路径:
"${pageContext.request.contextPath}/emp" method="POST" modelAttribute="employee">
三 修改Tomcat的web.xml
如果上面的方法不好使,那是因为其根源在于Web服务器默认的只支持Post和Get这两种“只读”的请求方法,而不支持rest风格的put,delete等方法的。因此我们在 Tomcat目录下的conf
目录下的web.xml
文件中,进行修改:
servlet>
default
org.apache.catalina.servlets.DefaultServlet
param>
<param-name>debugparam-name>
<param-value>0param-value>
param>
param>
<param-name>listingsparam-name>
<param-value>falseparam-value>
param>
param>
//主要是这里,默认的readonly属性是true,即不支持put方法,改为false
<param-name>readonlyparam-name>
<param-value>falseparam-value>
param>
<load-on-startup>1load-on-startup>
若web.xml中已经存在readonly就修改value为false,若没有就新加。
如果对你有帮助,点赞;如果你发现的新的问题,请留言。谢谢!