我正在查看有关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方法,但验证方法永远不会被执行。
任何人都可以帮助我吗?
答案 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);