java-有没有办法使用带有Spring 3带注释的Controller的多个Validator?

提问

我有一个Spring 2.x控制器,该控制器扩展了SimpleFormController,从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()委托给它们,但这真的是最好的解决方案吗?

最佳答案

这是一个老问题.

在此处添加评论:

在春季3.2.1.RELEASE之后,可以使用DataBinder#addValidators(Validator… validators).