@RequestBody:
作用:
主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的);
要求:
GET方式無請求體,所以使用@RequestBody接收數據時,前端不能使用GET方式提交數據,而是用POST方式進行提交。
在后端的同一個接收方法里,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多只能有一個,而@RequestParam()可以有多個。
簡言之:
一個請求——》只有一個@RequestBody;
一個請求——》可以有多個@RequestParam。
******①同時使用@RequestParam()和@RequestBody
@RequestParam( )指定的參數可以是普通元素、數組、集合、對象等等
(即: @RequestBody 與@RequestParam()可以同時使用時,原SpringMVC接收參數的機制不變,只不過RequestBody 接收的是請求體里面的數據(get是默認的請求體,post是提交表單需要的請求體);而RequestParam接收的是key-value里面的參數,所以它會被切面進行處理從而可以用普通元素、數組、集合、對象等接收)。
因此:
1、如果參數時放在請求體中,傳入后台的話,那么后台要用@RequestBody才能接收到
否則就會在數據庫中不能完成curd操作;
2、如果不是放在 請求體中的話,那么后台接收前台傳過來的參數時,要用@RequestParam來接收,或則形參前什么也不寫也能接收。
******②參數前寫了@RequestParam(xxx)
1、前端必須有對應的xxx名字才行(不管是否有值,可通過設置該注解的required屬性來調節是否必須傳)
2、如果沒有xxx名的話,那么請求會出錯,報400。
******③參數前不寫@RequestParam(xxx)
1、前端是否有對應的xxx名字都行,如果有xxx名的話,那么就會自動匹配
2、沒有的話,請求也能正確發送。
&&&追注:這里與feign消費服務時不同;feign消費服務時,如果參數前什么也不寫,那么會被默認@RequestBody的。
******④如果后端參數是一個對象,且該參數前是以@RequestBody修飾的,那么前端傳遞json參數時,必須滿足以下要求:
后端@RequestBody注解對應的類在將HTTP的輸入流(含請求體)裝配到目標類
(也就是:@RequestBody后面的類)時,會根據json字符串中的key來匹配對應實體類的屬性,如果匹配一致且json中的該key對應的值符合)
(或者說:實體類的對應屬性的類型要求時,會調用實體類的setter方法將值賦給該屬性。)
1、json字符串中,如果value為 "" 的話(空串),后端對應屬性如果是String類型的,那么接受到的就是 ""
如果是后端屬性的類型是Integer、Double等類型,那么接收到的就是null。
2、json字符串中,如果value為null的話,后端對應收到的就是null。
3、如果某個參數沒有value的話,在傳json字符串給后端時,要么干脆就不把該字段寫到json字符串中;要么寫value時, 必須有值,null 或""都行。
千萬不能有類似"stature":,這樣的寫法,如:
總結:
結論①:@JsonAlias注解,實現:json轉模型時,使json中的特定key能轉化為特定的模型屬性;但是模型轉json時,
對應的轉換后的key仍然與屬性名一致
結論②:@JsonProperty注解,實現:json轉模型時,使json中的特定key能轉化為指定的模型屬性;同樣的,模
型轉json時,對應的轉換后的key為指定的key
結論③:@JsonAlias注解需要依賴於setter、getter,而@JsonProperty注解不需要。
結論④:在不考慮上述兩個注解的一般情況下,key與屬性匹配時,默認大小寫敏感。
結論⑤:有多個相同的key的json字符串中,轉換為模型時,會以相同的幾個key中,排在最后的那個key的值給模
型屬性復制,因為setter會覆蓋原來的值。見示例中的gender屬性。
結論⑥:后端@RequestBody注解對應的類在將HTTP的輸入流(含請求體)裝配到目標類(即:@RequestBody后面
的類)時,會根據json字符串中的key來匹配對應實體類的屬性,如果匹配一致且json中的該key對應的值
符合(或可轉換為)實體類的對應屬性的類型要求時,會調用實體類的setter方法將值賦給該屬性。
轉自CSDN大神:https://blog.csdn.net/justry_deng/article/details/80972817