我想分两步对我的实体进行验证。虽然我使用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。
答案 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";
}
}