在做项目的过程中,一个表单(form)的提交总是报错,400--bad request
在我的项目中,提交表单的方式是:
如上图,form表单的提交,是通过jquery的serializeObject()方法,序列化表单并返回字符串,这里我们需要对页面显示为“是否”的Boolean类型值转换回来为true/false;后面的时间类型的toString()也可以不加,因为转换的默认是成为string类型的。
解决方法:
- 检查前端提交的数据和后台pojo类中的属性是否名字一一对应。
-
前台提交的数据在-->"检查(ctrl+shift+I)"-->network中可以获得:
查看前台提交的数据 - 后台直接查看pojo类,检查pojo类中的每个属性的名字和前端传过来的“form data”是否是一致的,必须一一对应,尤其要注意大小写。
-
如果名字都是对的,那么检查所有非string类型的属性,比如int,float,double类型的数据,在set方法中,对其进行string类型的转换,即从页面拿到的是string类型,然后存放为int,float,double等相应的类型。
例如:
修改原有的set方法 时间类型,尤为关键
-
在pojo类中,添加@JsonFormat(parttern=“yyy-MM-dd HH:mm:ss”)来限定时间的样式
timestamp类型数据 前台获取后台保存的时间类型信息进行显示的时候,显示的是yyy-MM-dd HH:mm:ss格式的时间。后台获取前台传过来String类型的数据,将其转换为timestamp类型来保存在数据库中,在set方法中要进行类型的转换。
========
以上问题解决了之后,又遇见了一次400的问题,在修改的时候,有学生的信息不全,有些属性中为空值,且在当次修改中不会为其填值,即:需要提交部分表项为空的表单。
这个时候,就又遇见了令人头疼的 400 BAD REQUEST。
检查一下,发现还是Spring无法将空字符串值赋给int,float和double等类型的属性。
对于这个问题,目前还没有找到解决的办法,我的方式是:在前端用js设置这几个属性的输入框为必填项,如果不填则页面报错提示,不执行提交表单的动作。
这个方法虽然解决了400问题,但是其实上是避开了400问题,希望以后能找到好的方法解决。
解决方法:
对于上文的空值无法转换封装为pojo类导致400报错的问题,今天终于找到了解决的办法。
首先对于上文的“解决方法”中的第2点进行修正,如上文所述进行修正,只能解决从string类型到相应的Integer等类型的转换,但是对于表项为空,即“ ”仍然不能实现转换,故而这种方法其实是错误的!
正确的解决方法:
在控制层(controller)中添加@InitBinder注解,如下:
相应的修改方法如下:
对应的student类应当为原本的类型即可,即不需要对非String类型进行转换:
这样操作,最终实现了表单完美封装成对应的pojo类,解决400错误!
欲详细了解,请参照:SpringMVC中@InitBinder注解的作用
关于@InitBinder注解实现表单多对象精准绑定接收