方法中的@ModelAttribute


问题内容

想象这样的代码:

@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) {        
    ...
}

我使用初始化绑定程序来避免可以绑定字段,并在绑定之前用@ModelAttribute标记方法(prepareUser())以准备我的User对象。因此,当我调用/
user / save时,将执行initBinder()和prepareUser()。

我在@InitBinder和@ModelAttribute中都设置了“用户”,因此Spring-
MVC可以理解,该方法仅应在使用@ModelAttribute(“ user”)执行方法之前应用。

问题在于,用@ModelAttribute(“ user”)注释的方法是在此控制器的每个映射方法之前执行的。例如,如果我调用/ users
prepareUser,则会在list()方法之前执行。如何使此准备器仅在具有所有方法在同一控制器中的save()方法之前执行?

谢谢


问题答案:

那不是真的@ModelAttribute。如果将其用作方法参数,则将带注释的参数放入模型中(可以)。如果将其放在方法上,则每次都会调用它以提供控制器中每个方法都应有权访问的参考数据。

如果要控制建立用户对象的控制,则有几种选择。对我来说最明显的两个是:

  1. 使用InitBinder方法添加新的自定义编辑器(PropertyEditor类)以构建User对象,
  2. 在Spring 3中使用转换服务将字符串用户名转换为User对象。