springboot傳值踩坑


      由於我現在寫的項目都是前后端分離的,前端用的是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中類的用法

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM