2013-07-31 2 views
0

В течение многих лет я использую @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 довольно хорошо, но использую ли я это для цели, изначально не предназначенной для этого? Я нарушаю здесь какое-то основное правило?

ответ

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

Я думаю, что это более ясно понимать. Но я не думаю, что вы «нарушаете какое-то основное правило здесь».

+0

Единственное, что мне нравится в первом методе, это то, что вы получите экземпляр своего компонента формы, созданный магией весной, когда вы нажмете методы вашего обработчика. Я выяснил, что вы должны отметить их публично, иначе прокси-сервер CGLIB работает, и ни одна из зависимостей не связана между собой. Я согласен, с точки зрения простого чтения кода, что он немного неясен, как создается компонент формы, но я чувствую, что если вы используете Spring, то вы уже должны знать. Кроме того, вы должны документировать свой код в любом случае. – CodeChimp

Смежные вопросы