Spring MVC验证器注释+自定义验证 [英] Spring MVC validator annotation + custom validation

查看:168
本文介绍了Spring MVC验证器注释+自定义验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆