我在控制器中使用了@ModelAttribute错误吗?

时间:2013-07-31 18:47:44

标签: spring spring-mvc

多年来我一直在使用@ModelAttribute来创建和初始化我的命令对象,如下所示:

@RequestMapping()
public String someHandler(@ModelAttribute("formBean") FormBean formBean) {
  // Do something
}

@ModelAttribute("formBean")
public FormBean createFormBean() {
  FormBean formBean = new FormBean();
  // Do some sort of initialization
  return formBean;
}

在这个例子中,我在Controller中有一个需要FormBean的处理程序,以及一个“create”方法,如果一个人不在模型中(或者如果使用@SessionAttributes,则为会话)。因此,当我运行someHandler()方法时,FormBean已经存在并填充,因为我的createFormBean()已经运行了。

然而,我的同事声称,虽然这很好用,但是我误用了@ModelAttribute用于它不打算用于的目的,即创建Command对象。在他对the JavaDoc的解释中,你应该只使用@ModelAttribute来创建静态数据,比如用于填充下拉列表等的项目。

我知道这可以很好地创建和初始化我的Command对象,但是我是否将它用于最初不打算用于的目的?我在这里打破了一些基本规则吗?

1 个答案:

答案 0 :(得分:1)

@ModelAttribute("formBean")
public FormBean createFormBean() {
  FormBean formBean = new FormBean();
  // Do some sort of initialization
  return formBean;
}

如果您需要在从视图绑定表单值之前初始化模型属性,这将非常有用。例如,您可以从数据库中查询对象(以便在当前会话中使用它)。

在其他情况下,我更喜欢使用此方法:

@RequestMapping
public String someHandler(final Model model) {
  FormBean formBean = new FormBean();
  // Do some sort of initialization
  model.addAttribute("formBean", formBean);
}

我认为理解更清楚。但我不认为你“在这里打破一些基本规则”。