В течение многих лет я использую @ModelAttribute, чтобы создать и инициализировать мой объект команды следующим образом:Я использую @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;
}
В этом примере, у меня есть обработчик в контроллере, который нуждается в компоненте форме, и метод «создать», что дает один, если он еще не находится в Модели (или сеансе, если используется @SessionAttributes). Итак, когда мой метод someHandler() запущен, FormBean уже существует и заселен, потому что мой createFormBean() уже запущен.
Однако мой коллега утверждает, что, хотя это работает очень хорошо, я неправильно использую @ModelAttribute с той целью, для которой он не предназначался, а именно в создании объекта Command. В своей интерпретации от the JavaDoc вы должны использовать @ModelAttribute для создания статических данных, например элементов, используемых для заполнения раскрывающегося списка или тому подобного.
Я знаю, что это работает для создания и инициализации моего объекта Command довольно хорошо, но использую ли я это для цели, изначально не предназначенной для этого? Я нарушаю здесь какое-то основное правило?
Единственное, что мне нравится в первом методе, это то, что вы получите экземпляр своего компонента формы, созданный магией весной, когда вы нажмете методы вашего обработчика. Я выяснил, что вы должны отметить их публично, иначе прокси-сервер CGLIB работает, и ни одна из зависимостей не связана между собой. Я согласен, с точки зрения простого чтения кода, что он немного неясен, как создается компонент формы, но я чувствую, что если вы используете Spring, то вы уже должны знать. Кроме того, вы должны документировать свой код в любом случае. – CodeChimp