因爲我如今寫的項目都是先後端分離的,前端用的是vue,後端springboot,因而先後端傳值的問題就是一個比較重要的問題,爲此我還特地去學了一下vue的傳值,其實就是用一個axios組件,其實就是基於promise對ajax的封裝,用法和ajax幾乎同樣,有興趣的能夠學學vue;html
通常而言這種先後端分離的狀況,先後端數據交互用的是json傳遞,而在spring中已經有兩個註解定義好了,能夠直接使用@RequestBody和@ResponseBody;前端
舒適提示,如下代碼默認你已經會使用swagger框架,lombok註解vue
1. RequestBody註解java
看名字這個註解就是和請求有關的,而事實也確實如此,@RequestBody註解的做用是將前端傳過來的json字符串轉換成java對象,用法以下:ios
大家能夠不用實現InitializingBean,這個接口是我測試其餘東西用到的程序員
@RestController @Api(value="測試校驗註解controller",tags="測試校驗註解controller") @Slf4j public class TestController implements InitializingBean{ // 測試數據庫數據 @PostMapping("/hello") @ApiOperation(value = "傳入對象校驗", notes = "傳入對象校驗") public User hello(@RequestBody @Valid User user) { System.out.println(user); return user; } }
@Data @Accessors(chain=true) public class User { @NotBlank @Size(max=3,message="名字最多隻能是3位") private String name; @NotBlank private String age; }
相信你們對上面代碼很熟悉了,其中在方法hello方法的參數中,咱們用了@RequestBody註解修飾user對象,這個時候從前端傳過來的json字符串就被映射到user中,我順便用了一下@Valid註解校驗傳值是否非空,咱們能夠用這個很簡單的判斷user對象有沒有接收到;es6
打開swagger的ui界面,就是項目啓動的 ip:端口/swagger-ui.htmlajax
而後點擊try it out,能夠看到結果:spring
後端也收到了數據:數據庫
到這裏一切是如此美好,而後忽然有的時候前端抽風或者是當你接收一些奇葩項目的時候,前端傳值首字母大寫,你會怎麼樣?有人說這很簡單啊,我只須要把後端對應的User中對應的字段也改一下啊,咱們看看結果:
測試結果以下,這裏我有個校驗的全局異常處理器作了處理;這個時候說明後端Name字段接收數據失敗,這是個大坑,項目中把我坑了好半天。。
解決辦法一:讓前端變量命名用駝峯,即首字母小寫,那麼後端字段只須要跟前端同樣就能夠了;
解決辦法二:後端在接收變量的該字段中添加註解:
測試結果:
2. ResponseBody註解
順便講一下這個註解,這個註解顧名思義,就是將java對象以自動轉化爲json字符串的形式返回給前端,咱們能夠在每個方法上加一個這個註解,可是經常使用的作法就是在Controller上使用RestController註解,那麼咱們直接在方法中返回對象就行了,不用手動的轉成json而後再傳
其實這兩個註解@RequestBody和@ResponseBody 原理上都差很少,其實很簡單,用到一個轉換器HttpMessageConverter ,將Http請求體中的json取到,而後用開源的Jason進行轉換成java對象,後面有時間能夠分析一下源碼
反思
因爲如今大多都是先後端分離的,雖然使得後端程序員不須要再去關注頁面的邏輯了,這也極大的減輕了後端的壓力,將壓力前移了,可是這也形成了一些問題,就是先後端要進行頻繁的聯調,這也說明了接口文檔的重要性,項目初期定義好接口文檔真的能夠省下不少功夫,避免後期頻繁調整;
其實吧,有時間學一下前端的內容仍是頗有意思的,最近在學vue,才知道es6。。(҂ ˘ _ ˘ ),不過用es6很舒服,相似java中類的用法
還有就是字段的命名規則,求求你了,用駝峯吧!!!