概述
之前的写了一篇《springMVC数据绑定参数》的文章(https://blog.csdn.net/javaYouCome/article/details/90692437),大概包含了所有能遇到的数据绑定参数的问题,可最近的项目中遇到了一个数据绑定的抗,一般是不会发现,可如果遇到了绝对让够吃一壶的。虽然解决很好处理,还是跟着我看下问题的原因吧。
一、正常数据绑定
首先来看下实体中带有集合对象的数据绑定的例子:Student(学生)对象有name, age属性,Teacher(老师)对象有name, age, List<Student> students这三个属性。代码如下:
@Data
class Student {
private String name;
private int age;
}
@Data
class Teacher {
private String name;
private int age;
private List<Student> students;
}
Controller中的数据绑定代码如下(前台传递一个Teacher对象直接输出)
@PostMapping("/test")
public Teacher test(@RequestBody Teacher teacher){
System.out.println(teacher);
return teacher;
}
Postman测试传递一个Teacher的Json数据,观察输出结果。(绑定成功)
二、异常情况(结果会很意外)
数据库中有两个表(t_link:客户联系人)和(t_custer:客户),映射的实体是TLink有name, sex两个属性,TCuster有name, age和List<TLink> tLinks三个属性,代码如下
@Data
class TLink {
private String name;
private String sex;
}
@Data
class TCuster {
private String name;
private int age;
private List<TLink> tLinks;
}
Controller中和上面的相同
@PostMapping("/test1")
public TCuster test(@RequestBody TCuster tCuster){
System.out.println(tCuster);
return tCuster;
}
Postman测试传递一个TCuster的Json数据,观察输出结果。( WTF失败)
眼尖的同学到这,可能已经解决问题了,就是在后台往前台返回的teacher对象,里面‘tLinks’竟然被转成了“tlinks”了。这个坑不知道有没有同学和我一样踩的很着实。
究其原因得想到将Json转成Teacher,再将对象转成Json是谁的事--Jackson的MappingJackson2HttpMessageConverter转换器的锅。我猜想它在序列化和反序列化(json和javaBean互转)时,根据json的key和对象属性的名称对应时,“驼峰命名”规则存在bug,导致的将类似“tLinks”的key名称去对象中查找叫“tlinks”的成员变量,自然赋不上值。最后往前台返回teacher对象,jackson序列化成json,“驼峰命名”bug再次处理成员tLinks时,又搞成了“tlinks”。
解决办法:
将实体中的所有成员变量名称,规范化命名,将类Teachert的成员tLinks,改成links。继续测试:成功。
(完)