【发布时间】:2011-10-25 19:11:42
【问题描述】:
我有一个域对象类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是否是一个好主意,因为我必须保护一些不应由客户端直接修改的字段(即在本例中为“启用”)。
这些替代方案的优缺点是什么:
- 使用域对象并保护不允许用户修改的字段(例如手动将它们设置为 null 或默认值)
- 使用一组新的辅助对象(类似于 DTO),例如仅包含我想通过 REST API 公开的字段的 UserRequest,并将它们映射(即使用 @ 987654321@) 到域对象。
第二种选择如下所示:
@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);
...
}
}
有没有其他方法可以避免代码重复,更容易维护?
【问题讨论】:
标签: java rest jpa spring-mvc