我爱编程

400-Not Found

2018-03-26  本文已影响0人  夏臻Rock

在做项目的过程中,一个表单(form)的提交总是报错,400--bad request
在我的项目中,提交表单的方式是:


表单
表单中的Boolean类型和日期类型的显示
表单提交

如上图,form表单的提交,是通过jquery的serializeObject()方法,序列化表单并返回字符串,这里我们需要对页面显示为“是否”的Boolean类型值转换回来为true/false;后面的时间类型的toString()也可以不加,因为转换的默认是成为string类型的。

解决方法:

  1. 检查前端提交的数据和后台pojo类中的属性是否名字一一对应。
  1. 如果名字都是对的,那么检查所有非string类型的属性,比如int,float,double类型的数据,在set方法中,对其进行string类型的转换,即从页面拿到的是string类型,然后存放为int,float,double等相应的类型。
    例如:

    修改原有的set方法
  2. 时间类型,尤为关键

========
以上问题解决了之后,又遇见了一次400的问题,在修改的时候,有学生的信息不全,有些属性中为空值,且在当次修改中不会为其填值,即:需要提交部分表项为空的表单
这个时候,就又遇见了令人头疼的 400 BAD REQUEST。
检查一下,发现还是Spring无法将空字符串值赋给int,float和double等类型的属性
对于这个问题,目前还没有找到解决的办法,我的方式是:在前端用js设置这几个属性的输入框为必填项,如果不填则页面报错提示,不执行提交表单的动作。
这个方法虽然解决了400问题,但是其实上是避开了400问题,希望以后能找到好的方法解决。

解决方法:

对于上文的空值无法转换封装为pojo类导致400报错的问题,今天终于找到了解决的办法。

首先对于上文的“解决方法”中的第2点进行修正,如上文所述进行修正,只能解决从string类型到相应的Integer等类型的转换,但是对于表项为空,即“ ”仍然不能实现转换,故而这种方法其实是错误的


正确的解决方法:

在控制层(controller)中添加@InitBinder注解,如下:

@InitBinder注解
相应的修改方法如下:
方法
对应的student类应当为原本的类型即可,即不需要对非String类型进行转换
示例
这样操作,最终实现了表单完美封装成对应的pojo类,解决400错误!

欲详细了解,请参照:SpringMVC中@InitBinder注解的作用
关于@InitBinder注解实现表单多对象精准绑定接收

上一篇 下一篇

猜你喜欢

热点阅读