2013-11-04 30 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固定它。