当只显示Spring MVC的模型bean的一部分,是有办法的模型只更新什么来自浏览器的后退?
比方说,我们有一个用户类(公共属性只有在这个例子中,当然):
public class User {
public String firstName;
public String lastName;
public String email;
public Date subscriptionExpiration;
}
现在我显示第一三个属性如在JSP输入域和要相应地更新在数据库中的对象。 只有这3个参数应更新,而不是第四个。 做到这将是一个办法
@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);
}
但是这将意味着硬编码可能会改变所有的属性,这是我不喜欢太多。
有没有什么办法来确定哪些字段基于什么用户被允许改变更新吗? 这种机制应该不仅仅是假设一切的请求中的参数可以改变的,否则任何精明的用户可以手动注入额外的字段到一个请求聪明。
使用@Entity(dynamicUpdate =真)不能解决问题,或者在我的眼前,因为我没有得到整个用户对象回到请求,这样做会带来许多安全漏洞。
我缺少在春天有个不错的功能,或者是有任何其他方式这个问题在概念解决? 任何提示是非常感谢!
见这个问题知道如何使用@InitBinder允许/防止一些模型字段由Spring绑定到请求参数。 这允许在确认subscriptionExpiration
不能通过注入一个请求参数进行修改。
而看到的文档了解如何使用的方法和方法的参数@ModelAttribute注解从数据库加载用户,并将其添加到模型被称为@RequestMapping方法之前,当填充该用户用请求参数@ RequestMapping方法被调用。 这使得从数据库获取用户和春天有从请求来临NE值来填充它。 所有你需要做的是验证用户的新状态,并将其保存到数据库中。
我觉得方法
BeanUtils.copyProperties(Object source, Object target, String[] ignoreProperties)
你想要做什么。 它复制从一个对象到另一所有属性不接触在定义的属性String[] ignoreProperties
。
给定源bean的属性值复制到指定的目标bean,忽视了给予“ignoreProperties”。
注:源和目标类没有匹配,甚至彼此得到的,只要属性相匹配。 在源bean公开,但目标bean的任何bean的属性不将默默地被忽略。
这仅仅是一个方便的方法。 对于更复杂的传输需求,可以考虑使用一个完整的BeanWrapper接口。
API文档
你可以先读取数据库中的对象,然后绑定请求。 你可以找到一个例子FuWeSta-样品 。
它使用一个辅助性的bean必须由Spring初始化。
一种选择是利用隐藏字段的表单。 与抽奖背上一个选项,但它工作在某些情况下,
你正在寻找的很好的特性是@ModelAttribute 。 我假设你的表格也将发布的用户ID。
public class UserController {
@ModelAttribute
public User getUser(@RequestParam(value = "id", required = false) Long id) {
return User.loadFromDB(id);
}
@RequestMapping("/user/{id}", method=RequestMethod.POST)
public String saveChanges(@ModelAttribute User user, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
// return ...
}
// model.asMap().clear();
user.saveToDB();
// return ...
}
}
我有同样的问题,最后只需添加类型转换器解决。
public class AbstractDocumentConverter implements Converter<String, AbstractDocument> {
private AbstractDocumentRepository abstractDocumentRepository;
public AbstractDocumentConverter(AbstractDocumentRepository abstractDocumentRepository) {
this.abstractDocumentRepository = abstractDocumentRepository;
}
@Override
public AbstractDocument convert(String id) {
return abstractDocumentRepository.findOne(id);
}
}
我使用MongoDB的,是AbstractDocument是所有我的文档超类,在控制器中我添加@ModelAttribute(“ID”)。
@RequestMapping("save")
public String save(@ModelAttribute("id") SportGame game) {
sportGameService.save(game);
return "redirect:/game/list";
}
它会先转换ID到模型(在我的转换器是一个找到从DB通过ID),然后填写从请求参数模型字段。