簡體   English   中英

Spring Restful編輯-保存更改的最佳實踐是什么

[英]Spring Restful edit - what's the best practice to save changes

所以我現在是一個彈簧控制器:

@Controller
@RequestMapping("/user")
public class UserController() {

    @RequestMapping(value = "/edit/{id}", method = RequestMethod.PUT)
    public @ResponseBody HTTPResponseDTO edit(@RequestBody String data, @PathVariable long id) {
        // marshall data String to User entity
        ObjectMapper mapper = new ObjectMapper();
        User marshaledUser = mapper.readValue(data, User.class);
        User databaseUser = session.get(id, User.class);
        //hibernate things to save
        ...
        // session.save(user);
    }

數據字符串采用以下json格式:

{"name":"value1",
 "email":"value2",
 "note":"value3"}

responseDTO看起來很簡單:

{"result":"success"}

當客戶端傳遞數據json時,它將僅傳遞正在編輯的值,例如:

{"email":"value2"}

在這種情況下,其他未提供的字段將被視為null。

但是,“ note”是一個可為空的字段,並且允許用戶清除“ note”字段-在我當前的設計中,這樣做時,它將類似於:

{"note":null}

問題1:這是我的難題:如何判斷用戶是否故意將其設置為null,還是僅因為未從數據字符串中傳入而將其設置為null?

問題2:當控制器接收到數據字符串時,我將有一個來自此數據的實體,然后將按ID查詢數據庫以獲取現有的User對象。 合並這兩個對象的最佳實踐是什么? 尋找在marshaledUser中存在的字段並將其設置為databaseUser看起來像很多重復的工作:

if (marshaledUser.name != null) {
    databaseUser.name = marshaledUser.name;
}
if (marshaledUser.email != null) {
    databaseUser.email = marshaledUser.email;
}
if (marshaledUser.note != null) { // refer to question 1...
    databaseUser.note = marshaledUser.note;
}

一個對象可以輕松擁有超過5個字段-如果幾乎相同的語句看起來不值得,則為5個字段。處理此問題的最佳實踐是什么?

問題1:這是我的難題:如何判斷用戶是否故意將其設置為null,還是僅因為未從數據字符串中傳入而將其設置為null?

你不能 因此,要么更改您的方法並始終傳遞一個完整的User(這就是我要做的),而不是僅傳遞幾個字段,要么將JSON解組到Map(或JsonObject)。 如果密鑰存在,但具有空值,則該值已傳遞且為空。 如果密鑰不存在,則表示尚未通過。

問題2:當控制器接收到數據字符串時,我將有一個來自此數據的實體,然后將按ID查詢數據庫以獲取現有的User對象。 合並這兩個對象的最佳實踐是什么?

與問題1相同。如果客戶端傳遞了一個完整的User對象而不是僅傳遞幾個字段,它將變得更加簡單。 該方法看起來像

@RequestMapping(value = "/edit/{id}", method = RequestMethod.PUT)
public @ResponseBody HTTPResponseDTO edit(@RequestBody User user, @PathVariable long id)
    user.setId(id);
    session.merge(user);
}

或者至少,您只需將傳遞的用戶的每個字段復制到持久字段,而不必關心是否已發送。

同樣,返回包含result = success的HttpResponseDTO是多余的。 如果該方法正常完成,它將返回200-OK HTTP狀態。 如果不是,那么您應該返回另一個HTTP狀態代碼。

我認為一種方法是從數據庫中讀取目標對象並將其隱式轉換為json。 然后使用此處描述的技術合並您的請求json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM