Spring @Validated和@InitBinder

时间:2016-03-17 14:15:04

标签: java spring validation spring-mvc

我正在尝试使用带有@Validated的Spring验证程序验证我的表单。

但是,我很困惑为什么我需要在@InitBinder中指定验证器。

以下是我从控制器获取的相关代码片段:

@InitBinder("organisationForm")
private void initBinder(WebDataBinder binder) {
    binder.setValidator(new OrganisationFormValidator());
}

@RequestMapping(value = "/addOrganisation", method = RequestMethod.POST)
public String addOrganisationPost(@Validated @ModelAttribute("organisationForm") OrganisationForm organisationForm, BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
        return "configuration/addOrganisation";
}

这很好但我需要为每个请求指定一个@InitBinder

Spring有一种方法可以对所有转换器进行注册,如下所示:

@Override
public void addFormatters(FormatterRegistry formatterRegistry) {
     ConversionServiceFactory.registerConverters(getConverters(), 
     formatterRegistry);
}

Spring中是否没有“验证服务”查看所有验证器并选择正确的验证服务,可能使用Spring supports接口强制执行的Validator方法:

public boolean supports(final Class<?> clazz) {
    return OrganisationForm.class.isAssignableFrom(clazz);
}

在Spring中不存在这似乎很奇怪。我误解了什么吗?

1 个答案:

答案 0 :(得分:2)

您可以使用@ControllerAdvice向init binders添加验证器,并且可以指定Model Attributes和ExceptionHandler。

如果要在整个控制器(或通过特定的控制器列表)中使用验证器,可以使用其属性为其指定控制器类。

@ControllerAdvice(assignableTypes = { Controller1.class, Controller2.class})