簡體   English   中英

Spring Controller:使用域對象作為@RequestBody

[英]Spring Controller: use domain objects as @RequestBody

我有一個域 object class User (它是一個 JPA 實體):

@Entity
public class User {
   private String name;
   private boolean enabled = true;
   // getters/setters
}

我正在嘗試提供 REST API 以允許客戶使用 Spring 3 MVC 創建新用戶:

@Controller
public class UserController {
    @RequestMapping(value="/user", method=RequestMethod.POST)
    @ResponseBody
    public String createRealm(@RequestBody User user) {
            user.setEnabled(true); // client is not allowed to modify this field
            userService.createUser(user);
            ...
    }
}

它工作得很好,但我不知道將域對象用作 @RequestBody是否是個好主意,因為我必須保護一些不應由客戶端直接修改的字段(即在這種情況下為“啟用”)。

這些替代方案的優點/缺點是什么:

  1. 使用域對象並保護不允許用戶修改的字段(例如將它們設置為 null 或手動設置為默認值)
  2. 使用一組新的輔助對象(類似於 DTO),例如只包含我想通過 REST API 和Z1D78DC8ED51214E518B5114FE249對象公開的字段的 UserRequest

第二種選擇如下所示:

@Entity
public class User {
   private String name;
   private boolean enabled = true;
   // getters/setters
}

public class UserRequest {
   private String name;
   // enabled is removed
   // getters/setters
}

@Controller
public class UserController {
    @RequestMapping(value="/user", method=RequestMethod.POST)
    @ResponseBody
    public String createRealm(@RequestBody UserRequest userRequest) {
            User user = ... // map UserRequest -> User
            userService.createUser(user);
            ...
    }
}

有沒有其他方法可以避免代碼重復並且更容易維護?

還有另一種選擇 - 您可以使用DataBinder.setDisallowedFields(..) (或使用.setAllowedFields(..) )禁止提交給定的一組屬性

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields(..);
}

如果您有一個或兩個不同的屬性,這很好。

否則,使用特殊的 object(如ProfileDetailsUserRequest )更有意義。 我在這種情況下使用了類似 DTO 的 object,然后使用BeanUtils.copyProperties(..)從 commons-beanutils 傳輸字段

第三種可能更好的選擇是將所有與配置文件相關的字段放入一個單獨的實體(使用@OneToOne和用戶映射)或@Embeddable object,然后使用它。

暫無
暫無

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

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