想象一下像这样的代码:
@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绑定器来避免字段可以绑定,我用@ModelAttribute标记一个方法(prepareUser()),以便在绑定之前准备我的User对象。因此,当我调用/ user / save initBinder()并执行prepareUser()时。
我在@InitBinder和@ModelAttribute中都设置了“user”,因此Spring-MVC可以理解只有在使用@ModelAttribute(“user”)执行方法之前才应用此方法。
问题是使用@ModelAttribute(“user”)注释的方法在此控制器的每个映射方法之前执行。例如,如果我调用/ users,则在list()方法之前执行prepareUser。我怎样才能使这个准备器只在具有同一控制器中所有方法的save()方法之前执行?
由于
答案 0 :(得分:7)
这不是@ModelAttribute
的真正含义。如果您将它用作方法参数,它会将带注释的参数放入模型中(没关系)。如果你把它放在一个方法上,每次都会调用它来提供控制器中每个方法都应该有权访问的参考数据。
如果要控制构建User对象,可以使用多种方法。对我来说最明显的两个是: