Spring MVC + Hibernate:来自浏览器的部分模型更新

usi*_*mon 5 java spring hibernate spring-mvc

当只显示Spring MVC模型bean的一部分时,有没有办法只在模型中更新从浏览器返回的内容?

假设我们有一个User类(当然只有这个例子中的公共属性):

public class User {
  public String firstName;
  public String lastName;
  public String email;
  public Date subscriptionExpiration;
}
Run Code Online (Sandbox Code Playgroud)

现在,我将前三个属性显示为JSP中的输入字段,并希望相应地更新数据库中的对象.只应更新这3个参数,而不是第4个参数.实现这一目标的一种方法是

@RequestMapping("/user/{userId}", method=RequestMethod.POST)
public String saveChanges(@PathVariable userId, User user, Model model) {
  User oldUser = User.loadFromDB(userId);
  oldUser.firstName = user.firstName;
  oldUser.lastName = user.lastName;
  oldUser.email = user.email;
  oldUser.saveToDB();

  model.addAttribute("user", oldUser);
}
Run Code Online (Sandbox Code Playgroud)

但这意味着硬编码所有可能改变的属性,我不太喜欢.

有没有办法根据用户允许更改的内容确定要更新的字段?该机制应该比仅仅假设请求参数中的所有内容都可以更改更聪明,否则任何精明的用户都可以手动将其他字段注入请求中.

使用@Entity(dynamicUpdate = true)并不能解决我眼中的问题,因为我没有在请求中返回整个User对象,这样做会打开很多安全漏洞.

我在Spring中错过了一个不错的功能,还是有其他方法可以在概念上解决这个问题?任何提示都非常感谢!

JB *_*zet 3

请参阅此问题了解如何使用@InitBinder来允许/阻止Spring绑定某些模型字段来请求参数。这可以确保不能通过subscriptionExpiration注入请求参数来修改。

请参阅文档,了解如何在方法和方法参数上使用 @ModelAttribute 注释,以便在调用 @RequestMapping 方法之前从数据库加载用户并将其添加到模型中,以及在 @RequestMapping 方法调用时使用请求参数填充该用户。调用 RequestMapping 方法。这允许从数据库获取用户并让 Spring 使用来自请求的新值填充它。您所要做的就是验证用户的新状态并将其保存到数据库中。