gpt4 book ai didi

java - Spring Controller : use domain objects as @RequestBody

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:26:17 25 4
gpt4 key购买 nike

我有一个域对象类 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. 使用域对象并保护不允许用户修改的字段(例如将它们设置为空或手动设置为默认值)
  2. 使用一组新的辅助对象(类似于 DTO),例如只包含我想通过 REST API 公开的字段的 UserRequest,并映射它们(即使用 Dozer ) 到域对象。

第二种选择是这样的:

@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(..);
}

如果您有一个或两个不同的属性,这很好。

否则,拥有一个特殊对象(如 ProfileDetailsUserRequest)更有意义。我在这个场景中使用了这样一个类似 DTO 的对象,然后使用来自 commons-beanutils 的 BeanUtils.copyProperties(..) 传输字段

第三种可能更好的选择是将所有与配置文件相关的字段放入一个单独的实体(使用 @OneToOne 与用户映射)或放入一个 @Embeddable 对象,并改用它。

关于java - Spring Controller : use domain objects as @RequestBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com