Hibernate Validator: ограничить проверку заданными ограничениями - PullRequest
0 голосов
/ 11 января 2019

Я хочу выполнить проверку моих сущностей в два этапа. Хотя я использую 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 и вставить ее в контекст проверки? Я обнаружил, что мы можем перенастроить контекст фабрики с помощью следующего кода, но я не знаю, как с этим справиться.

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

На данный момент я потерян. Кто-то уже сделал что-то подобное? Ты хоть представляешь, как я могу это сделать? Спасибо за ваше время.

Я использую Java 8 и Hibernate Validator 6.0.14.

1 Ответ

0 голосов
/ 11 января 2019

Как пишет Слав - используйте группы.

Пример

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";
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...