【问题标题】:@ModelAttribute in a method方法中的@ModelAttribute
【发布时间】:2011-05-19 03:18:31
【问题描述】:

想象一下这样的代码:

@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 binder 来避免绑定字段,并使用 @ModelAttribute 标记方法 (prepareUser()) 以在绑定之前准备我的 User 对象。因此,当我调用 /user/save initBinder() 并执行 prepareUser() 时。

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

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

谢谢

【问题讨论】:

  • prepareUser 究竟做了什么?
  • @skaffman 它采用用户名参数并从数据库中加载用户对象,因此所有无法绑定的数据(例如密码)在绑定后持久化时不会被空值覆盖跨度>

标签: java spring data-binding spring-mvc


【解决方案1】:

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

如果您想控制构建您的用户对象,您有多种选择。对我来说最明显的两个是:

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

【讨论】:

  • 好的我知道它应该在带有属性编辑器的 initbinder 中完成,但我不明白带有 @ModelAttribute 注释的方法的真正目的是什么。你能告诉我一个典型用途的例子吗?另外,如果在每个方法之前执行,为什么可以在注释中作为值给出字符串(例如@ModelAttribute(“user”)中的“user”)?
  • @Javi 好问题。首先,我认为它应该在 initbinder 中完成,这是可能的。我更喜欢更现代的转换服务方法。使用 @ModelAttribute 注释的方法的典型用途是用于控制器中所有方法所需的参考数据。以宠物商店为例,控制器可能具有列出宠物和查看单个宠物的方法,但它们都需要类别菜单的信息(“兔子”、“狗”等)。它使您不必在每种方法中重复此操作。
  • @Javi 至于为什么可以给它起个名字,是为了让Spring可以把返回的对象放到那个名字下的模型中。 Spring手册中的例子值得一看:static.springsource.org/spring/docs/3.0.x/…
  • 虽然我理解了这个理论,但我不明白它与转换服务一起使用,所以我问了另一个问题:stackoverflow.com/questions/4347284/conversionservice-in-spring
  • @GaryF 请看我的问题。 stackoverflow.com/questions/30053709/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2012-02-21
  • 2015-02-09
相关资源
最近更新 更多