Spring:没有调用自定义验证器

时间:2013-11-04 17:29:27

标签: java spring validation spring-mvc web

我正在查看有关Spring自定义验证器的其他问题,但遗憾的是我无法通过建议的答案解决我的问题。

我的问题如下:我有一个实体(Account),我创建了一个自定义验证器(AccountValidator),我在控制器(RegisterController)中使用它,但它永远不会使用默认的Validator调用。

我忘记了什么吗?我附上部分代码以帮助更好地理解我的问题。

验证

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方法,但验证方法永远不会被执行。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我通过在上下文xml文件中声明类 AccountValidator 并使用@validated代替@valid来修复它。

答案 1 :(得分: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将执行默认验证(基于您的验证提供程序,例如Hibernate),然后您应用自定义验证。

答案 2 :(得分:0)

我遇到了同样的问题,事实证明我得到了一个SQL异常,似乎绕过了我的验证器,因为我的方法是用@Transactional注释的。

答案 3 :(得分:0)

我认为您要使用binder.addValidator(accountValidator);代替binder.setValidator(accountValidator);