前台通过Ajax传送数据,后台接收不到
SpringBoot返回Json实体类属性的时候把属性名首字母变小写了,数据名不统一
最近在做项目(SpringBoot框架)的时候碰到了一个耽误两天都没解决的问题:前端Ajax传输数据格式正常(json对象转json字符串),后台接收逻辑正常,用@RequestBody注释,用对象数组和对象集合接收数据,但是后台接收不到数据,全为空值,数据项不允许为空还报错。如下图示
#前端Ajax传数据,json字符串格式,多个传输对象
#后台Controller接收数据
后台@RequestBody接受的是一个json格式的字符串,这样才能解析出来!检查了所有的逻辑和数据名之间的对应以及数据类型,发现都没有什么错误,前台传送的数据在浏览器控制台也能打印出来
但是数据表插入的数据都是空的
而且如果数据项设置不允许为空就直接报错500,控制台错误信息提示为该数据项没有默认的值。
综合以上推断,后台接收数据在某个地方出了问题,数据放在那里,拿不到,我一直是以为取数据的方式出了问题,在网上搜索各种方式都行不通,但是万万没想到是数据放在那里而无法识别,不是数据名对不上的原因,而是数据名首字母大写的原因!!!Json返回的时候把首字母变小写了这样一来就造成了数据名对不上你还一无所知的情况,所以后台接收的数据和你要封装的实体类完全对不上,不是报错就是空值。
解决办法:将实体类所有数据名首字母变为小写或者在实体类属性值的getter方法上面添加@JsonProperty注解,这样一来你get到的属性名就能保持原来的大写样式(万能的百度告诉我的),前者是将所有的数据名小写处理,后者是大写始终大写,保留原来的样子,最终的目的都是统一数据名,使得前后台接收数据一致
问题虽小,但是很难发现,以前从来没注意还有这种事情,要不是我实验室同学帮忙,估计还要折磨我一阵子,感谢阿锐,写此记录谨记教训!
——————————————————————————
注:spring默认的命名方式,首字母转小写,连续大写字母都转成小写。
也就是说getter()和setter()方法都会将属性名转为大写, 如果你的属性名是大写的,它的getter()、setter()方法也是setA… getA… ,程序会自动默认你传过来的属性是小写的,而你在前端用大写传参还以为是大写的,其实已经不是了。
——————————————————2021.2.1,深圳