如何使用@Valid进行自定义验证?

时间:2011-09-13 13:58:30

标签: spring spring-mvc hibernate-validator

我正在使用hibernate验证注释框架来验证我的域类 并使用@Valid注释验证我的域对象,如下所示:

@RequestMapping(method = RequestMethod.POST)
    public String post(@Valid @ModelAttribute("person") Person person,BindingResult errors) {...}

我想知道我是否想进行自定义验证,例如检查数据库中是否存在电子邮件

我现在正在做的是在域中拥有一个属性:

@AssertFalse(message = "{email.missmatch}")
private boolean emailExist;

我在post方法中设置它:

person.setEmailExist(personDao.isEmailExist(person.getEmail()));

上面正在使用自定义的hibernate验证器类我必须验证域 我在设置属性后调用了验证器

但现在使用@Valid,在设置属性

之前调用验证器

那么,在这种情况下是否有使用@Valid的解决方案? 或者它不起作用,如果它不起作用请建议我如何在这种情况下验证我的域类而不是使用@Valid,使用什么?

提前感谢。

2 个答案:

答案 0 :(得分:0)

您可以编写yor complet自己的验证器,因此您不需要使用tbat标记属性进行“hack”。如何编写这样的自定义验证在jsr303 Bean Validation - 规范中进行了描述。谷歌为它,你也会发现很多带有例子的博客。

答案 1 :(得分:0)

我使用自定义javax验证器:

Validator validator = Validation.buildDefaultValidatorFactory()
                .getValidator();
        Set<ConstraintViolation<Person>> cvs = validator.validate(person);
        for (ConstraintViolation<Person> cv : cvs) {
            String field = cv.getPropertyPath().toString();
            errors.addError(new FieldError("person", field, cv.getMessage()));
        }

它工作正常。