8

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

我的问题如下:我有一个实体 (Account),我创建了一个自定义验证器 (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 方法,但从未执行过验证方法。

谁能帮我?

4

4 回答 4

2

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

于 2017-01-25T05:38:23.633 回答
0

我遇到了同样的问题,结果发现我遇到了一个 SQL 异常,似乎绕过了我的验证器,因为我的方法用 @Transactional 进行了注释。

于 2014-01-05T05:24:20.733 回答
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),然后您应用自定义验证。

于 2013-11-04T17:37:55.977 回答
0

我想你想用binder.addValidator(accountValidator);而不是binder.setValidator(accountValidator);

于 2016-04-05T06:02:07.903 回答