0

多年来,我一直在使用 @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;
}

在此示例中,我在需要 FormBean 的 Controller 中有一个处理程序,以及一个“创建”方法,如果模型(或会话,如果使用 @SessionAttributes)中还没有一个,则给它一个。因此,当我的 someHandler() 方法运行时,FormBean 已经存在并填充,因为我的 createFormBean() 已经运行。

然而,我的同事声称,虽然这工作得很好,但我滥用 @ModelAttribute 的目的并非出于本意,即在创建 Command 对象时。在他对JavaDoc的解释中,您应该只使用 @ModelAttribute 来创建静态数据,例如用于填充下拉列表等的项目。

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

4

1 回答 1

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);
}

我觉得理解起来比较清楚。但我不认为你“在这里打破了一些基本规则”。

于 2013-07-31T19:22:10.720 回答