Spring Controller:将域对象用作@RequestBody

我有一个域对象类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);

...

}

}

它很好用,但是我不知道

是否是一个好主意,因为我必须保护某些不应由客户端直接修改的字段(在这种情况下为“启用”)。

这些替代方案的优点/缺点是什么:

  1. 使用 并保护不允许用户修改的字段(例如,手动将其设置为null或默认值)
  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的对象,然后BeanUtils.copyProperties(..)从commons-

beanutils 传输字段

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

以上是 Spring Controller:将域对象用作@RequestBody 的全部内容, 来源链接: utcz.com/qa/414248.html

回到顶部