У меня есть контроллер Spring 2.x, который расширяет SimpleFormController
, который устарел с весны 3 в пользу аннотированных контроллеров. Поэтому я пытаюсь преобразовать его для использования @Controller
, с @InitBinder
и @Valid
для проверки формы. Однако я не могу найти способ использовать несколько валидаторов с контроллером Spring 3.x. Как мне это сделать?
Вот как выглядит bean def моего контроллера:
<bean name="/s/account" class="mywork.AccountSettingsController"
p:formView="forms/account"
p:successView="redirect:/app/s/account"
p:commandName="accountSettingsForm">
<property name="validators">
<list>
<ref bean="emailFormatValidator" />
<ref bean="uniqueEmailValidator" />
<ref bean="changeEmailValidator" />
<ref bean="passwordWithConfirmationValidator" />
<ref bean="changePasswordValidator" />
</list>
</property>
</bean>
Это контроллер страницы, который позволяет пользователю изменять свой адрес электронной почты и пароль. Бины-валидаторы являются устаревшим кодом, но я предполагаю, что они были разделены на отдельные классы для лучшей возможности повторного использования.
Я пытаюсь переместить все это в сам класс контроллера, используя аннотации:
@Controller
@Secured({BaseController.ROLE_LOGGED_IN})
@RequestMapping("/s/account")
public class AccountSettingsController extends BaseController {
private static final String FORM_URL = "/forms/account";
private static final String FORM_NAME = "accountSettingsForm";
@InitBinder(FORM_NAME)
public void initBinder(WebDataBinder binder) {
// TODO: how to inject > 1 validator for the form?
binder.setValidator(...);
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView get() {
ChangePasswordOrEmailForm form = new ChangePasswordOrEmailForm();
...
return new ModelAndView(FORM_URL, FORM_NAME, form);
}
...
}
Насколько я могу судить, Spring 3 предполагает отношение 1: 1 между: Controller-Form-WebDataBinder-Validator. Я мог бы создать составной валидатор, который объединит 5 отдельных компонентов валидатора и делегирует им вызовы Validator#supports()
и Validator#validate()
, но действительно ли это лучшее решение?