踩坑(2) 关于Request method 'PUT' ('DELETE')not supported

踩坑(2) 关于Request method ‘PUT’ (’DELETE’)not supported

在RESTful风格中,我们会将原本的GET,POST方法通过HiddenHttpMethodFilter过滤器和隐藏域 转换为 对应的方法。

但实际上,实际写代码会总出错。出现如:
Request method 'PUT' not supportedRequest 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,若没有就新加。

如果对你有帮助,点赞;如果你发现的新的问题,请留言。谢谢!

你可能感兴趣的:(踩坑记录)