Hibernate Validator:将验证限制为给定约束

时间:2019-01-11 16:30:17

标签: java validation hibernate-validator

我想分两步对我的实体进行验证。虽然我使用defaultValidatorFactory验证实体的所有字段,然后再保存到数据库,但我想在较早的步骤中对实体进行部分验证。但是我找不到配置我的验证器(或validatorFactory)的方法。

假设我有以下课程:

public class Car {

    @NotNull
    private String manufacturer;

    @AssertTrue
    private boolean isRegistered;

    public Car(String manufacturer, boolean isRegistered) {
        super();
        this.manufacturer = manufacturer;
        this.isRegistered = isRegistered;
    }
}

当我对实体进行完全验证时,我使用给定的代码:

Validator validator = validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Car>> errors = validator.validate(car);

这可以很好地工作并验证NotNull和AssertTrue这两个注释。

现在,我想执行部分验证。我的意思是通过部分验证,我只想验证例如NotNull约束,而忽略其他注释。

有没有办法获取使用验证器的自定义受限列表的Validator或ValidatorFactory?

您可以找到很多东西来创建自己的约束/约束验证器。就我而言,我只想验证一些约束条件。

也许我可以创建一个自定义ConstraintValidatorFactory并将其注入Validation上下文中?我发现我们可以使用以下代码重新配置工厂的上下文,但是我不知道如何处理。

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validatorFactory.usingContext().constraintValidatorFactory(myCustomFactory);

此刻,我迷路了。有人已经做了类似的事情?你知道我该怎么做吗?感谢您的宝贵时间。

我正在使用Java 8和Hibernate Validator 6.0.14。

1 个答案:

答案 0 :(得分:0)

Slaw写道-使用小组。

示例

package jpatest.jpatest;

import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.NotNull;

public class TestApp {

    /** A validation group marker */
    public interface ValidationGroup1 {};

    /** The bean  */
    public static class Bean {

        // Validate for group ValidationGroup1
        @NotNull(groups = ValidationGroup1.class)
        private String s;
    }

    public static void main(String[] args) {
        Bean b = new Bean();
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        // Validation without the validation group => No ConstraintViolation
        Set<ConstraintViolation<Bean>> errors1 = validator.validate(b);
        assert errors1.isEmpty() : "No ConstraintViolation expected";
        // Validation with the validation group => 1 ConstraintViolation
        Set<ConstraintViolation<Bean>> errors2 = validator.validate(b, ValidationGroup1.class);
        assert errors2.size() == 1 : "1 ConstraintViolation expected";
    }

}