Я обновляюсь с Spring 2.5 до Spring 3.2. У меня есть контроллер MVC, который ранее расширял CancellableFormController
. Он объявил отдельно методы initBinder()
и onBind()
. Я реорганизовал контроллер, чтобы использовать аннотацию @Controller
, и переключил переопределенный метод initBinder()
на использование аннотации Spring MVC 3 @initBinder
.
Мой конкретный вопрос заключается в том, что в Spring MVC 3 при обновлении с Spring 2.5 как реорганизовать переопределенный метод onBind()
для использования эквивалента аннотации? Сигнатура существующего метода:
@Override
protected void onBind(HttpServletRequest request, Object command, BindException errors) throws Exception {
MyCommand cmd = (MyCommand) command;
....
}
Я подумал об использовании @initBinder()
и поместил код ранее в onBind()
внутри этого аннотированного метода. Но мое замешательство вот в чем:
- При этом будет ли код вызываться в то же время в общем процессе фреймворка, что и раньше?
- Как получить дескриптор объекта Command из аннотированного метода
@initBinder
.
Могу ли я просто объявить его как еще один параметр в сигнатуре метода, и среда Spring MVC гарантирует, что я получу копию? Похоже, что в старом методе onBind()
объект Command уже создан (методом formBackingObject
). Могу ли я с уверенностью предположить, что это также имеет место при использовании метода @initBinder
?
Спасибо всем за некоторые идеи. Я пытаюсь ускорить процесс Spring MVC!
Моя существующая сигнатура метода @initBinder
выглядит примерно так:
@InitBinder
protected void initBinder(WebDataBinder binder) {
// register custom editor here.. etc
}
Я надеюсь, что смогу сделать что-то вроде:
@InitBinder
protected void initBinder(WebDataBinder binder, MyCommand cmd) {
// register custom editor here.. etc
}
Является ли это стандартным передовым подходом для обновления метода cancellableformcontroller onBind() с использованием аннотаций?
Попытка, основанная на ответе, отмеченном как правильный, все еще не работает:
@InitBinder("myCommand")
protected void onBind(WebDataBinder binder) throws Exception {
MyCommand cmd = (MyCommand) binder.getTarget();
.... // do whatever was required here...
}
Обойти
Пожалуйста, смотрите мои комментарии ниже для нулевого флага. Создайте частный метод с той же логикой, что и в onBind(), а затем после проверки объекта команды в аннотированном методе onSubmit() (POST/GET) сделайте вызов ныне несуществующему методу onBind(), передав ваш объект Command в виде параметр. Что-то вроде следующего:
@RequestMapping(method=RequestMethod.POST)
public ModelAndView onSubmit(@ModelAttribute("myCommand") MyCommand cmd, BindingResult result, <any other params> {
new MyCommandValidator().validate(cmd, result);
if (result.hasErrors()) {
return new ModelAndView("context");
}
onBind(cmd, <any other params>);
... // do business stuff
}
Кажется, это уродливый обходной путь, который подходит для моего конкретного случая.