Gui*_*ido 7 java rest jpa spring-mvc
我有一个域对象类User(它是一个JPA实体):
@Entity
public class User {
private String name;
private boolean enabled = true;
// getters/setters
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Spring 3 MVC提供REST API以允许客户端创建新用户:
@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);
...
}
}
Run Code Online (Sandbox Code Playgroud)
它的伟大工程,但我不知道这是否是一个好主意,使用域对象作为@RequestBody,因为我要保护一些领域不应该由("已启用",在这种情况下,IE)的客户端直接进行修改.
这些替代方案的优缺点是什么:
第二种选择如下:
@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);
...
}
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以避免代码重复并且更容易维护?
还有另一种选择 - 您可以使用DataBinder.setDisallowedFields(..)(或使用.setAllowedFields(..))禁止提交一组给定的属性
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields(..);
}
Run Code Online (Sandbox Code Playgroud)
如果您有一个或两个不同的属性,这很好.
否则,拥有一个特殊对象(如ProfileDetails或UserRequest)更有意义.我在这种情况下使用类似DTO的对象,然后使用BeanUtils.copyProperties(..)commons-beanutils 传输字段
第三个也许更好的选择是将所有与配置文件相关的字段放入一个单独的实体(@OneToOne与用户映射)或一个@Embeddable对象,然后使用它.
| 归档时间: |
|
| 查看次数: |
3422 次 |
| 最近记录: |