【发布时间】:2011-05-19 03:18:31
【问题描述】:
想象一下这样的代码:
@RequestMapping(value="/users", method=RequestMethod.GET)
public String list(Model model) {
...
}
@InitBinder("user")
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("password"); // Don't allow user to override the value
}
@ModelAttribute("user")
public User prepareUser(@RequestParam("username") String username){
...
}
@RequestMapping(value="/user/save", method=RequestMethod.POST)
public String save(@ModelAttribute("user") User user, Model model) {
...
}
我使用 init binder 来避免绑定字段,并使用 @ModelAttribute 标记方法 (prepareUser()) 以在绑定之前准备我的 User 对象。因此,当我调用 /user/save initBinder() 并执行 prepareUser() 时。
我在@InitBinder 和@ModelAttribute 中都设置了“user”,所以Spring-MVC 可以理解这个方法只能在使用@ModelAttribute("user") 执行方法之前应用。
问题是使用@ModelAttribute("user") 注释的方法在此控制器的每个映射方法之前执行。例如,如果我调用 /users prepareUser 在 list() 方法之前执行。我怎样才能使这个准备器只在 save() 方法在同一个控制器中具有所有方法之前执行?
谢谢
【问题讨论】:
-
prepareUser究竟做了什么? -
@skaffman 它采用用户名参数并从数据库中加载用户对象,因此所有无法绑定的数据(例如密码)在绑定后持久化时不会被空值覆盖跨度>
标签: java spring data-binding spring-mvc