2016-03-17 48 views
1

我想用Spring驗證器驗證我的表單,並使用@ValidatedSpring @Validated和@InitBinder

但是,我很困惑,爲什麼我需要在@InitBinder中指定Validator。

這裏是從控制器我的相關代碼片段:

@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

春天有在註冊的所有轉換器像這樣的一種方式:

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

有沒有春天有個「驗證服務」,看起來通過所有驗證,並選擇正確的,也許使用supports方法由Spring Validator接口強制執行:

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

只是似乎很奇怪,這並不在Spring存在。我誤解了一些東西嗎?

+0

看起來很奇怪,你不使用驗證框架。 – zeroflagL

+0

@zeroflagL我正在使用[Spring框架的驗證](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/Validator.html) – dkanejs

+0

對不起,我的評論是措辭厲害。我的意思是像Bean驗證。這非常簡單。 – zeroflagL

回答

2

您可以使用@ControllerAdvice將驗證程序添加到您的init綁定程序,並且您可以指定模型屬性和ExceptionHandler。

如果您想要通過控制器使用驗證器(或者通過控制器的特定列表),您可以使用其屬性指定控制器類。

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

不錯的解決方案,但它仍然需要我將驗證程序專門綁定到每個綁定程序,如@InitBinder(「organisationForm」)。是否真的沒有辦法註冊所有的驗證器,並讓'@ Validated'使用Validator'' supports'方法來找到合適的? – dkanejs

+1

@Geditdk如果你不想綁定Validators,你可以使用'jsr 303'驗證框架。 'hibernate'和'spring'提供的實現 – Pragnani