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 にハンドラーがあり、Model (または @SessionAttributes を使用している場合はセッション) にまだない場合はそれを与える "create" メソッドがあります。そのため、someHandler() メソッドが実行されると、フォーム Bean は既に存在し、作成されています。これは、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 に答える