方法中的@ModelAttribute

Jav*_*avi 6 java data-binding spring 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) {        
    ...
}
Run Code Online (Sandbox Code Playgroud)

我使用init绑定器来避免字段可以绑定,我用@ModelAttribute标记一个方法(prepareUser()),以便在绑定之前准备我的User对象.所以当我调用/ user/save initBinder()和prepareUser()时执行.

我在@InitBinder和@ModelAttribute中都设置了"user",因此Spring-MVC可以理解只有在使用@ModelAttribute("user")执行方法之前才应用此方法.

问题是使用@ModelAttribute("user")注释的方法在此控制器的每个映射方法之前执行.例如,如果我调用/ users,则在list()方法之前执行prepareUser.我怎样才能使这个准备工作只在具有同一控制器中所有方法的save()方法之前执行?

谢谢

Gar*_*ryF 7

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

如果要控制构建User对象,可以使用多个选项.对我来说最明显的两个是:

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

  • @Javi至于为什么你可以给它一个名字,所以Spring可以把返回的对象放在该名称下的模型中.Spring手册中的示例值得一看:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib (2认同)