Spring MVC数据绑定问题(实体中包含集合数据绑定问题)

概述 

之前的写了一篇《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。继续测试:成功。

(完) 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章