Динамический командный класс в аннотированном контроллере - PullRequest
5 голосов
/ 09 октября 2010

Начиная с Spring MVC 3, AbstractCommandController устарела, поэтому вы больше не можете указывать класс команды в setCommandClass(). Вместо этого вы жестко кодируете класс команды в списке параметров обработчика запросов. Например,

@RequestMapping(method = RequestMethod.POST)
public void show(HttpServletRequest request, @ModelAttribute("employee") Employee employee)

Моя проблема в том, что я разрабатываю общую страницу, которая позволяет пользователю редактировать общий бин, поэтому класс команд неизвестен до времени выполнения. Если переменная beanClass содержит класс команды, с AbstractCommandController, вы просто выполните следующее:

setCommandClass(beanClass)

Так как я не могу объявить объект команды как параметр метода, есть ли способ иметь параметры запроса Spring bind для универсального компонента в теле обработчика запроса?

1 Ответ

6 голосов
/ 10 октября 2010

Создание объекта команды - единственное место, где Spring должен знать класс команд.Однако вы можете переопределить его с помощью @ModelAttribute -аннотированного метода:

@RequestMapping(method = RequestMethod.POST) 
public void show(HttpServletRequest request, 
    @ModelAttribute("objectToShow") Object objectToShow) 
{
    ...
}

@ModelAttribute("objectToShow")
public Object createCommandObject() {
    return getCommandClass().newInstance();
}

Кстати, Spring также отлично работает с реальными обобщениями:

public abstract class GenericController<T> {
    @RequestMapping("/edit")  
    public ModelAndView edit(@ModelAttribute("t") T t) { ... }
}

@Controller @RequestMapping("/foo")
public class FooController extends GenericController<Foo> { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...