【发布时间】:2012-04-05 07:49:46
【问题描述】:
我有一个扩展 SimpleFormController 的 Spring 2.x 控制器,它在 Spring 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>
它是一个页面控制器,允许用户更改他们的电子邮件地址和密码。验证器 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 假定以下之间存在一对一的关系:Controller-Form-WebDataBinder-Validator。我可以创建一个复合验证器来聚合 5 个单独的验证器 bean,并将 Validator#supports() 和 Validator#validate() 调用委托给它们,但这真的是最好的解决方案吗?
【问题讨论】:
标签: java spring-mvc validation