• 今天做项目碰到的一个问题:WARN


    一、问题重现

      今天做一个项目,使用到了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

  • 相关阅读:
    在Ubuntu/Centos使用 Let's Encrypt 证书部署 HTTPS的方法
    Ubuntu14.04安装配置LAMP环境(php5.6)
    centos6 php5.4 升級到php 5.6
    为自己的2017年定个计划
    收益的一些话
    学习瓦力部署系统的项目配置和上线部署
    统计进仓和出仓数量随时间变化的剩余数量流程图
    Codeigniter 获取当前的控制器名称和方法名称
    [记]Windows 系统下设置Nodejs NPM全局路径
    [记]Cordova安装插件选择插件版本
  • 原文地址:https://www.cnblogs.com/BoildWater/p/12676628.html
Copyright © 2020-2023  润新知