今天做项目碰到的一个问题:WARN - Request method 'POST' not supported

一、问题重现

  今天做一个项目,使用到了SpringMVC框架(版本4.2.4.RELEASE),问题重现:

  1.前端提交表单数据,表单中包含一个<input type="checkbox" name="defaultAddr">

  

 

   2.点击表单提交,使用ajax提交数据:

 

 

   3.在提交数据前,为了看到提交的数据内容,使用了js弹出框展示一下数据:

  

 

  4.数据提交到后台Controller层对应的代码是:

 

 

  5.然后控制台就出现了如下内容:(由于此时log4j配置文件日志打印级别设置的是info,所以仅仅出现了下面的报错信息)

  

 

 

二、问题解决方案

  1.刚看到这个问题的时候,我的第一个想法是,应该是数据的提交类型写错了,数据的提交类型不一致会导致出现Request method ' ' not supported,浏览器端405等信息。在我检查ajax请求类型和Controller方法请求类型之后,如上面的贴图所示,两者均是post请求类型,不应该出现这个问题。

 

  2.于是我就在想会不会是ajax函数写错了,几番检查之后,发现没有问题;紧接着又想会不会是我的Controller方法接口出现了问题,我使用postman工具测试了一下Controller接口,发现也没有问题;接下来,我又把ajax与Controller请求提交方式同时修改为get,结果还是会出现如上问题。

 

  3.找了好久问题所在,实在没则了,突然想到我的日志打印级别是info,或许改为debug级别就能看到更多的错误信息,于是我改了日志打印级别,重新调试了一遍,果然控制台还多出现了如下错误信息:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'address' on field 'defaultAddr': rejected value [on]; 
codes [typeMismatch.address.defaultAddr,typeMismatch.defaultAddr,typeMismatch.java.lang.Byte,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [address.defaultAddr,defaultAddr]; arguments []; default message [defaultAddr]]; d

  好吧,竟然发生了类型匹配错误了,于是我就去看我前端提交的数据,发现<input type="checkbox" name="defaultAddr" >提交的是一个字符串"on",而Address实体类对应的defaultAddr字段类型是Byte类型,SpringMVC会去为Address address自动封装数据,封装失败就会抛出上面的异常。而实际上我并不想让SpringMVC帮我封装dafaultAddr字段,因为我下面Controller层的代码逻辑是要判断<input type="checkbox" name="defaultAddr" >提交的值是否是"on",然后为defaultAddr赋一个Byte类型的值,想不到数据还没有进入方法体,就已经抛出WARN - Request method 'POST' not supported了。

 

  4.既然找到了问题所在,为了不让SpringMVC自动封装我提交过来的<input type="checkbox" name="defaultAddr" >值,防止与Address类中的字段发生冲突,我修改了该输入域name的属性<input type="checkbox" name="isDefault">

 问题解决。

 

三、问题反思

  1.重视日志打印,我就是因为觉得日志打印太多,影响我看自己程序的输出信息,所以才把日志级别设置成了info,导致日志打印较少,没有很好的定位问题所在。

   2.以后遇到这种405错误,可以按照以下步骤来查找问题:

    a.首先判断前后端的请求方式是否一致,如前端get请求,后端要求post请求就会出现问题;

    b.其次判断请求的数据类型是否一致,即看一下会不会是因为SpringMVC自动封装失败引起的问题;

四、拓展

  此外,在网上查询 Request method 'POST' not supported问题的解决方案时,发现了因为Spring版本导致出现该问题的案例,解决方案的连接如下:

  https://www.cnblogs.com/yuanfy008/p/9651326.html

 

posted @ 2020-04-11 20:37  BoildWater  阅读(717)  评论(0编辑  收藏  举报