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

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

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

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

谢谢

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

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

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