springboot傳值踩坑

      因爲我如今寫的項目都是先後端分離的,前端用的是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中類的用法

  還有就是字段的命名規則,求求你了,用駝峯吧!!!

相關文章
相關標籤/搜索