Java 有没有一种方法可以将多个验证器与带Spring3注释的控制器一起使用?

Java 有没有一种方法可以将多个验证器与带Spring3注释的控制器一起使用?,java,spring-mvc,validation,Java,Spring Mvc,Validation,我有一个Spring2.x控制器,它扩展了SimpleFormController,从Spring3开始,它就被弃用,取而代之的是带注释的控制器。因此,我尝试将其转换为使用@Controller,使用@InitBinder和@Valid进行表单验证。然而,我找不到一种方法在Spring3.x控制器上使用多个验证器。我该怎么做 以下是我的控制器的bean def当前的外观: 它是一个页面的控制器,允许用户更改他们的电子邮件地址和密码。验证器bean是遗留代码,但我猜它们被拆分为单独的类以获得更

我有一个Spring2.x控制器,它扩展了
SimpleFormController
,从Spring3开始,它就被弃用,取而代之的是带注释的控制器。因此,我尝试将其转换为使用
@Controller
,使用
@InitBinder
@Valid
进行表单验证。然而,我找不到一种方法在Spring3.x控制器上使用多个验证器。我该怎么做

以下是我的控制器的bean def当前的外观:


它是一个页面的控制器,允许用户更改他们的电子邮件地址和密码。验证器bean是遗留代码,但我猜它们被拆分为单独的类以获得更好的重用性

我正在尝试使用注释将所有这些内容移动到控制器类本身中:

@控制器
@安全({BaseController.ROLE_LOGGED_IN})
@请求映射(“/s/account”)
公共类AccountSettingsController扩展BaseController{
私有静态最终字符串FORM_URL=“/forms/account”;
私有静态最终字符串格式\u NAME=“accountSettingsForm”;
@InitBinder(表格名称)
公共绑定器(WebDataBinder绑定器){
//TODO:如何为表单注入>1个验证程序?
binder.setValidator(…);
}
@RequestMapping(method=RequestMethod.GET)
公共模型和视图获取(){
ChangePasswordOrEmailForm=新的ChangePasswordOrEmailForm();
...
返回新模型和视图(表单URL、表单名称、表单);
}
...
}

据我所知,Spring3假设控制器和WebDataBinder验证器之间存在1对1的关系。我可以创建一个复合验证器来聚合5个单独的验证器bean,并将
验证器#supports()
验证器#validate()
调用委托给它们,但这真的是最好的解决方案吗?

我能想到的最好的解决方案是注入一组验证器,然后自己手动旋转它们。现在我从控制器类中删除了
initBinder()
,下面是我添加的内容:

private List<Validator> accountSettingsValidators;

// Maps & Collections can't be @Autowired (by type OR name), so use the JSR 250 @Resource annotation to autowire by name
@Resource
public void setAccountSettingsValidators(List<Validator> accountSettingsValidators) {
    this.accountSettingsValidators = accountSettingsValidators;
}

@RequestMapping(method = RequestMethod.POST)
protected ModelAndView processSubmit(HttpServletRequest request,
                                     @ModelAttribute(FORM_NAME) ChangePasswordOrEmailForm form,
                                     BindingResult bindingResult) {
    for (Validator validator : this.accountSettingsValidators) {
        ValidationUtils.invokeValidator(validator, form, bindingResult);
    }

    if (bindingResult.hasErrors()) {
        return new ModelAndView(FORM_URL, FORM_NAME, form);
    }

    // process validated form
}

另一个我认为是有一个ValidatorFacade,它依次调用所有其他的验证器,这样你就不需要注入,而是用initBinder和@Valid在前面连接验证器Facade。你的表单bean会自动调用验证器Facade,所有的事情都会自动处理。只是一个想法。

这是一个老问题

在此处添加评论:


在spring 3.2.1.RELEASE之后,可以使用。

您的意思是喜欢?事实上,我在网上找到了一些不同的例子,所以我想这就是我要做的。是的。我更喜欢使用spring的autowire而不是xml注入其他验证器,但想法是一样的。谢谢,很高兴听到他们从spring Web MVC 2.x带回了这个选项!
<util:list id="accountSettingsValidators">
    <ref bean="emailFormatValidator" />
    <ref bean="uniqueEmailValidator" />
    <ref bean="changeEmailValidator" />
    <ref bean="passwordWithConfirmationValidator" />
    <ref bean="changePasswordValidator" />
</util:list>