2017-05-24 75 views
4

到目前爲止,我已經使用Spring Boot完成了一個(REST)項目,並且非常喜歡它。我發現有點狡猾的一件事是我對@RequestBody的理解。我是否需要爲Spring Boot中的每個@RequestBody分開一個對象

假設我有下面的POST方法來登錄用戶。我的用戶實體可能包含一些屬性,而不僅僅是用戶名和密碼,我希望發佈後請求。在這種情況下,我看不到任何其他選擇,只能製作一個額外的對象(LoginRequest)來保存傳入數據的數據。

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<User> login(@RequestBody LoginRequest request) { 
     User p = null; 
     if (request != null) { 
      p = User.login(request.getEmail(), request.getPassword()); // validates and returns user if exists 
      if (p != null){ 
       return new ResponseEntity<User>(p, HttpStatus.OK); 
      } 
     } 

     throw new IllegalArgumentException("Password or email incorrect"); 
    } 

類似地,我想要@ResponseBody返回其中例如密碼被排除的用戶對象的最小化版本。

這個問題的一些標準方法是什麼?我真的必須爲每個'json-view'創建一個單獨的對象嗎?我在Python中做了一些REST的東西,在這裏我只需要一個包含請求屬性的字典。任何類似的方法?

+0

您是否想忽略某個屬性的值作爲返回視圖或作爲請求讀取的同一類? – Zico

回答

2

1)創建一個新的實體,如果你將持續或在其上

2)操作如果需要對現有的實體的自定義視圖(添加/刪除字段)與自定義序列DTO可使用

3)有些情況下,如果您不想創建DTO,因爲您不會在任何地方重複使用它,但需要一些快速解決方案來實現您可以使用的自定義響應Map - 該鍵將用於JSON字段名稱,Object爲該值,例如:

@RequestMapping(method = RequestMethod.POST) 
    public Map<String, Object> login(@RequestParam Integer p1) { 
     Map<String, Object> map = new HashMap<>(); 
     map.put("p1", p1); 
     map.put("somethingElse", "456"); 
     return map; 
    } 

JSON響應:

{ 
    "p1": p1value, 
    "somethingElse": "456" 
} 

第三屆情況下會適合你,如果你不應該根據一些條件來定製嵌套對象建立過於複雜機構。反向使用第二個選項。

2

對此,有兩種方法可用於請求和響應 -
1.使用具有額外參數的相同實體並僅填充所需內容。你可以檢查空值。
2.使用單獨的數據傳輸對象(DTO) - 當實體具有與需要傳輸的對象不同的字段時,可以使用它們。個人而言,我喜歡第一種方法來節省映射實體到DTOs的工作,然後回來。但是,有時候DTO需要完全不同,我們需要使用第二種方法。例如。儀表板號碼和報告的API。

HTH

+0

不使用彈簧,但使用類似的框架。我決定使用一個DTO,其中每個屬性都是一個字符串(即使它最終會成爲數字或日期或實體上的其他內容)。因爲如果驗證失敗,我希望能夠重新顯示無效條目。如果我將一個字段映射爲日期並且用戶輸入'xyz',並且我重新顯示帶有驗證錯誤的表單,我希望能夠顯示錯誤值並讓它們編輯。不只是失去它。不確定春季是否會出現同樣的問題? –

+0

@NicholasSmith這聽起來更像是你應該有前端驗證。然後,服務器端驗證有意嘗試傳遞錯誤數據(例如通過curl發送無效請求)。 – Kayaman

+0

是的,我不知道他是否在做客戶端或服務器端驗證,這就是爲什麼我提到它。 –

相關問題