![](/img/trans.png)
[英]POST array in RequestBody to Spring Controller as List of Objects
[英]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是否是個好主意,因為我必須保護一些不應由客戶端直接修改的字段(即在這種情況下為“啟用”)。
這些替代方案的優點/缺點是什么:
第二種選擇如下所示:
@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(如ProfileDetails
或UserRequest
)更有意義。 我在這種情況下使用了類似 DTO 的 object,然后使用BeanUtils.copyProperties(..)
從 commons-beanutils 傳輸字段
第三種可能更好的選擇是將所有與配置文件相關的字段放入一個單獨的實體(使用@OneToOne
和用戶映射)或@Embeddable
object,然后使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.