2013-11-04 65 views
2

我正在查看關於Spring自定義驗證器的其他問題,但不幸的是我無法解決我提出的答案的問題。我有一個實體(帳戶),我創建了一個自定義驗證器(AccountValidator),我在控制器(RegisterController)中使用,但它永遠不會被調用,使用默認的驗證器。春天:自定義驗證器沒有被調用

我忘了什麼嗎?我附上部分代碼,以幫助我更好地理解我的問題。

驗證:

public class AccountValidator implements Validator{ 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return (Account.class).isAssignableFrom(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 

    //Validation code 

    } 

} 

控制器:

@Controller 
@RequestMapping(value = "/register") 
public class RegisterController { 

    @Autowired 
    private AccountValidator accountValidator; 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.setDisallowedFields("id"); 
     binder.setValidator(accountValidator); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    @ModelAttribute 
    public Account register(Locale currentLocale){ 
     Account account = new Account(); 
     return account; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String handleRegister(@Valid @ModelAttribute Account account, BindingResult result){ 
     if(result.hasErrors()){ 
      return "/register"; 
     } 
     return "home"; 
    } 
} 

我檢查了我的調試消息日誌中,並initBinder方法被調用,但驗證方法是永遠不會被執行。

任何人都可以幫助我嗎?

+0

我已經嘗試了一些東西,我無法重現您所看到的行爲。你能發佈一個完整的(最小)配置來重現這個嗎? –

回答

0

通過源代碼後,我可以找到WebDataBinder不會調用您的Validator的唯一原因是您的變量是null。該字段

@Autowired 
private AccountValidator accountValidator; 

必須是null。我不知道你是如何到達那裏的,如果它不能自動連接字段,Spring會抱怨。


目前,我不能告訴你爲什麼Validator當與WebDataBinder註冊是不能夠被調用,但這裏的解決辦法:

擺脫

binder.setValidator(accountValidator); 

並在處理程序方法中添加Validator呼叫

@RequestMapping(method = RequestMethod.POST) 
public String handleRegister(@Valid @ModelAttribute Account account, BindingResult result){ 
    accountValidator.validate(account, result); 
    if(result.hasErrors()){ 
     return "/register"; 
    } 
    return "home"; 
} 

Spring將執行默認驗證(基於您的驗證提供程序,例如。休眠),然後你應用你的自定義驗證。

+0

我不想明確調用驗證方法。假設在initBinder中配置它並使用@Valid進行註釋應該足夠了,但它不起作用... –

+0

@ r.rodriguez我能找到的唯一原因是你的'accountValidator'爲'null'。你可以發佈你的配置嗎? –

+0

我剛剛檢查過,它不是'null' –

0

我有這個相同的問題,結果我得到一個SQL異常,似乎繞過我的驗證程序,因爲我有我的方法註釋@Transactional。

0

我想你想使用的binder.addValidator(accountValidator);代替binder.setValidator(accountValidator);

1

我面臨着同樣的問題,我在上下文中的XML文件中聲明的類AccountValidator和到位的@valid使用@validated固定它。