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。繼續測試:成功。

(完) 

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