Spring MVC验证器注释+自定义验证 [英] Spring MVC validator annotation + custom validation
问题描述
我正在开发spring mvc应用程序,我应该根据Spring MVC验证器进行验证。我第一步为我添加了类和设置控制器的注释,它工作正常。现在我需要实现自定义验证器来执行复杂的逻辑,但我想使用现有的注释,只需添加额外的检查。
I'm working on spring mvc application, where I should aplly validation based on Spring MVC validator. I first step for that I added annotation for class and setup controller and it works fine. And now I need to implement custom validator for perform complex logic, but i want to use existing annotation and just add additional checking.
我的用户类:
public class User
{
@NotEmpty
private String name;
@NotEmpty
private String login; // should be unique
}
我的验证器:
@Component
public class UserValidator implements Validator
{
@Autowired
private UserDAO userDAO;
@Override
public boolean supports(Class<?> clazz)
{
return User.class.equals(clazz) || UsersForm.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors)
{
/*
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "NotEmpty.user");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "login", "NotEmpty.user");
*/
User user = (User) target;
if (userDAO.getUserByLogin(user.getLogin()) != null) {
errors.rejectValue("login", "NonUniq.user");
}
}
}
我的控制器:
@Controller
public class UserController
{
@Autowired
private UserValidator validator;
@InitBinder
protected void initBinder(final WebDataBinder binder)
{
binder.setValidator(validator);
}
@RequestMapping(value = "/save")
public ModelAndView save(@Valid @ModelAttribute("user") final User user,
BindingResult result) throws Exception
{
if (result.hasErrors())
{
// handle error
} else
{
//save user
}
}
}
那么,是吗?可以一起使用自定义验证器和注释吗?如果是的话怎么样?
So, Is it possible to use custom validator and annotation together? And if yes how?
推荐答案
我知道这是一个古老的问题但对于googlers来说......
I know this is a kind of old question but, for googlers...
你应该使用 addValidators
而不是 setValidator
。如下所示:
you should use addValidators
instead of setValidator
. Like following:
@InitBinder
protected void initBinder(final WebDataBinder binder) {
binder.addValidators(yourCustomValidator, anotherValidatorOfYours);
}
PS: addValidators
接受多个参数(省略号)
PS: addValidators
accepts multiple parameters (ellipsis)
如果你签出 org.springframework.validation.DataBinder
的来源,你会看到:
if you checkout the source of org.springframework.validation.DataBinder
you will see:
public class DataBinder implements PropertyEditorRegistry, TypeConverter {
....
public void setValidator(Validator validator) {
assertValidators(validator);
this.validators.clear();
this.validators.add(validator);
}
public void addValidators(Validator... validators) {
assertValidators(validators);
this.validators.addAll(Arrays.asList(validators));
}
....
}
如您所见 setValidator
清除现有(默认)验证器,因此 @Valid
注释将无效预期。
as you see setValidator
clears existing (default) validator so @Valid
annotation won't work as expected.
这篇关于Spring MVC验证器注释+自定义验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!