方法中的@ModelAttribute

时间:2010-12-02 13:20:28

标签: java spring data-binding spring-mvc

想象一下像这样的代码:

@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()方法之前执行?

由于

1 个答案:

答案 0 :(得分:7)

这不是@ModelAttribute的真正含义。如果您将它用作方法参数,它会将带注释的参数放入模型中(没关系)。如果你把它放在一个方法上,每次都会调用它来提供控制器中每个方法都应该有权访问的参考数据。

如果要控制构建User对象,可以使用多种方法。对我来说最明显的两个是:

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