由於我現在寫的項目都是前后端分離的,前端用的是vue,后端springboot,於是前后端傳值的問題就是一個比較重要的問題,為此我還特意去學了一下vue的傳值,其實就是用一個axios組件,其實就是基於promise對ajax的封裝,用法和ajax幾乎一樣,有興趣的可以學學vue;
一般而言這種前后端分離的情況,前后端數據交互用的是json傳遞,而在spring中已經有兩個注解定義好了,可以直接使用@RequestBody和@ResponseBody;
溫馨提示,以下代碼默認你已經會使用swagger框架,lombok注解
1. RequestBody注解
看名字這個注解就是和請求有關的,而事實也確實如此,@RequestBody注解的作用是將前端傳過來的json字符串轉換成java對象,用法如下:
你們可以不用實現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對象有沒有接收到;
打開swagger的ui界面,就是項目啟動的 ip:端口/swagger-ui.html
然后點擊try it out,可以看到結果:
后端也收到了數據:
到這里一切是如此美好,然后突然有的時候前端抽風或者是當你接收一些奇葩項目的時候,前端傳值首字母大寫,你會怎么樣?有人說這很簡單啊,我只需要把后端對應的User中對應的字段也改一下啊,我們看看結果:
測試結果如下,這里我有個校驗的全局異常處理器做了處理;這個時候說明后端Name字段接收數據失敗,這是個大坑,項目中把我坑了好半天。。
解決辦法一:讓前端變量命名用駝峰,即首字母小寫,那么后端字段只需要跟前端一樣就可以了;
解決辦法二:后端在接收變量的該字段中添加注解:
測試結果:
2. ResponseBody注解
順便講一下這個注解,這個注解顧名思義,就是將java對象以自動轉化為json字符串的形式返回給前端,我們可以在每一個方法上加一個這個注解,但是常用的做法就是在Controller上使用RestController注解,那么我們直接在方法中返回對象就好了,不用手動的轉成json然后再傳
其實這兩個注解@RequestBody和@ResponseBody 原理上都差不多,其實很簡單,用到一個轉換器HttpMessageConverter ,將Http請求體中的json取到,然后用開源的Jason進行轉換成java對象,后面有時間可以分析一下源碼
反思
由於現在大多都是前后端分離的,雖然使得后端程序員不需要再去關注頁面的邏輯了,這也極大的減輕了后端的壓力,將壓力前移了,但是這也造成了一些問題,就是前后端要進行頻繁的聯調,這也說明了接口文檔的重要性,項目初期定義好接口文檔真的可以省下很多功夫,避免后期頻繁調整;
其實吧,有時間學一下前端的內容還是很有意思的,最近在學vue,才知道es6。。(҂ ˘ _ ˘ ),不過用es6很舒服,類似java中類的用法
還有就是字段的命名規則,求求你了,用駝峰吧!!!